存在一些通用性问题。 所以,这是我正在处理的简单版本:
我有一个抽象类和两个子类:
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
答案 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
不是公共的,如果BWriter
和CWriter
在同一个包中,那么这很好,加上私有构造函数可以防止静态类的实例化。这需要更多的样板来为每个静态方法添加泛型,但是你没有多少选择 - you cannot use a classes generic types in a static context。