如何从子类静态方法调用泛型方法
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)
}
}
或者您可以像这样尝试使用 BWriter
和 CWriter
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,如果 BWriter
和 CWriter
在同一个包中,加上私有构造函数以防止实例化 static-只有 类。这需要更多样板文件来为每个静态方法添加泛型,但您没有太多选择 - you cannot use a classes generic types in a static context.
通用性存在一些问题。 所以,这是我正在处理的一个简单版本:
我有一个摘要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)
}
}
或者您可以像这样尝试使用 BWriter
和 CWriter
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,如果 BWriter
和 CWriter
在同一个包中,加上私有构造函数以防止实例化 static-只有 类。这需要更多样板文件来为每个静态方法添加泛型,但您没有太多选择 - you cannot use a classes generic types in a static context.