【问题标题】:How to call a generic method from a subclass static method如何从子类静态方法调用泛型方法
【发布时间】:2016-11-23 07:51:29
【问题描述】:

存在一些通用性问题。 所以,这是我正在处理的一个简单版本:

我有一个抽象类和两个子类:

public abstract class A {}
public class B extends A {}
public class C extends A {}

我正在为这些课程编写作家,并且我希望保持相同的架构,因为所有这些都有很多共同点。但我希望能够在不实例化的情况下调用作者

public abstract class AWriter<T extends A> {
  public void AWritingMethod(T arg) {}
}
public class BWriter extends AWriter<B> {
  public static void BWritingMethod(B arg) {
    AWritingMethod(arg)
  }
}
public class CWriter extends AWriter<C> {
  public static void CWritingMethod(C arg) {
    AWritingMethod(arg)
  }
}

显然,我不能在 BWriter 和 CWriter 中调用 AWritingMethod,但是我怎样才能做这样的事情来保持 AWriter 中的大部分工作,同时仍然保持 BWritingMethod 和 CWritingMethod 静态?

已经谢谢了!

LD

【问题讨论】:

  • 这根本没有意义。 AWriter.AWritingMethod 是一个实例方法,你想在不创建实例的情况下调用它……显然这是不可能的。

标签: java generics static-methods


【解决方案1】:

您可以更改您的代码如下,将static添加到AWritingMethod

public abstract class AWriter<T extends A> {
  public static void AWritingMethod(T arg) {}
}

public class BWriter extends AWriter<B> {
  public static void BWritingMethod(B arg) {
    AWriter.AWritingMethod(arg)
  }
}

public class CWriter extends AWriter<C> {
  public static void CWritingMethod(C arg) {
    AWriter.AWritingMethod(arg)
  }
}

或者您可以尝试使用 BWriterCWriter 类的新实例,如下所示:

public abstract class AWriter<T extends A> {
  public void AWritingMethod(T arg) {}
}

public class BWriter extends AWriter<B> {
  public static void BWritingMethod(B arg) {
    new BWriter().AWritingMethod(arg);
  }
}

public class CWriter extends AWriter<C> {
  public static void CWritingMethod(C arg) {
    new CWriter().AWritingMethod(arg);
  }
}

【讨论】:

  • 试过了,仍然得到“无法从静态上下文引用非静态方法'AWritingMethod (T)'”
  • Ifixed public static void AWritingMethod(T arg) {} 到静态方法。我想知道你想得到什么情况。如果要在静态方法中添加非静态方法,则需要将其作为实例新建。或将方法设为静态。
  • 将 AWritingMethod 设为静态不适用于泛型类型。不过,第二个选项有效,谢谢!!!
【解决方案2】:

如果您想将逻辑抽象到一个单独的类/方法中,最好的办法是执行以下操作:

class AWriter {
  private AWriter() {}
  static <T extends A> void AWritingMethod(T arg) {}
}

public class BWriter {
  private BWriter() {}
  public static <T extends B> void BWritingMethod(T arg) {
    AWriter.AWritingMethod(arg)
  }
}

public class CWriter {
  private CWriter() {}
  public static <T extends C> void CWritingMethod(T arg) {
    AWriter.AWritingMethod(arg)
  }
}

请注意AWriter 不是公共的,如果BWriterCWriter 在同一个包中,加上私有构造函数以防止仅静态类的实例化,这很好。这需要更多样板来为每个静态方法添加泛型,但您没有太多选择 - you cannot use a classes generic types in a static context

【讨论】:

    猜你喜欢
    • 2015-03-09
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多