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

How to call a generic method from a subclass static method

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

我有一个摘要class和两个子class:

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

我正在为那些 classes 编写作家,我想保持相同的架构,因为所有这些都有很多共同点。但是我希望能够在不实例化它的情况下调用编写器

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

您可以如下更改代码,将 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 class 的新实例:

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);
  }
}

如果您想将逻辑抽象到一个单独的 class/method 中,您最好的选择是这样做:

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 不是 public,如果 BWriterCWriter 在同一个包中,加上私有构造函数以防止实例化 static-只有 类。这需要更多样板文件来为每个静态方法添加泛型,但您没有太多选择 - you cannot use a classes generic types in a static context.