继承,泛型和Java中的铸造
问题描述:
我有两个类都extends Example
。继承,泛型和Java中的铸造
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?
}
}
那么,我回到我的泛型类型我如何得到这个实际正常工作和投Example
为任何classA
或classB
?
非常感谢
答
不能使用泛型类型实例化新对象(即你不能做new T(params)
)。
答
当您创建对象的具体实例(即,您使用新的)时,您已知道实际的实现类,不能使用泛型类型。
你究竟在努力实现什么?你如何决定是否要创建ClassA或ClassB?
试试这个:
public class ExampleManager {
public ClassA createClassA() {
return new ClassA("example","example");
}
public ClassB createClassB() {
return new ClassB("example","example");
}
}
或本:
答
正如其他人所说,你不能使用新创建未知类型的新实例。如果不使用反射,可以使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);
}
}
复制http://*.com/questions/75175/create-instance-of-generic-type-in-java – unholysampler 2010-04-15 20:35:23
你正在寻找*具体化泛型*。这在Java中不受支持。 C#支持它。在Java中,泛型只是编译时。查找工厂模式,请参阅上述链接以复制正确答案的问题。 – BalusC 2010-04-15 20:54:37
@BalusC:你看到如何在这里应用工厂模式?我只是没有得到如何在工厂实现'E create()'方法(来自汤姆霍金 - tackline回答http://*.com/questions/75175/create-instance-of-generic-type-in-java/75528#75528) – Roman 2010-04-15 21:17:33