如何从子类静态方法调用泛型方法

时间:2016-07-20 07:36:43

标签: java generics static-methods

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

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

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

2 个答案:

答案 0 :(得分:2)

您可以按照以下方式更改代码,将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) } } 添加到BWriter

CWriter

或者您可以尝试使用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); } } 和{{1}}类的新实例,如下所示:

{{1}}

答案 1 :(得分:0)

如果你想把逻辑抽象成一个单独的类/方法,最好的办法就是做这样的事情:

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