[英]Inheritance, Generics and Casting in Java
我有两个类都extends Example
。
public class ClassA extends Example {
public ClassA() {
super("a", "class");
}
...
}
public class ClassB extends Example {
public ClassB() {
super("b", "class");
}
...
}
public class Example () {
public String get(String x, String y) {
return "Hello";
}
}
这样就很好。 因此,假设我们还有另一个名为ExampleManager的类。 对于示例管理器,我想使用通用类型,因此返回该通用类型。 例如
public class ExampleManager<T extends Example> {
public T getExample() {
return new T("example","example"); // So what exactly goes here?
}
}
因此,在我返回通用类型的地方,如何classA
正常工作并将Example
为classA
或classB
?
非常感谢
您不能使用泛型类型来实例化新对象(即,您不能执行new T(params)
)。
在创建对象的具体实例时(即使用new ),您已经知道实际的实现类,不能使用泛型。
您实际上想达到什么目的? 您如何决定要创建ClassA还是ClassB?
尝试这个:
public class ExampleManager {
public ClassA createClassA() {
return new ClassA("example","example");
}
public ClassB createClassB() {
return new ClassB("example","example");
}
}
或这个:
public class ExampleManager {
public Example createExample() {
if(a == b) {
return new ClassB("example","example");
}
return new ClassB("example","example");
}
}
正如其他人所说,您不能使用new来创建未知类型的新实例。 如果不使用反射,则可以使ExampleManager成为工厂的抽象超类。
public abstract class ExampleManager<T extends Example> {
public abstract T getExample(String x, String y);
}
public class ClassAManager extends ExampleManager<ClassA> {
public ClassA getExample(String x, String y) {
return new ClassA(x, y);
}
}
public class ClassBManager extends ExampleManager<ClassB> {
public ClassB getExample(String x, String y) {
return new ClassB(x, y);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.