Java中的继承、泛型和转换

Java中的继承、泛型和转换,java,generics,inheritance,casting,Java,Generics,Inheritance,Casting,我有两个类,它们都扩展了示例 public class ClassA extends Example { public ClassA() { super("a", "class"); } ... } public class ClassB extends Example { public ClassB() { super("b", "class"); } ... } public class 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。对于示例管理器,我希望使用泛型类型,并因此返回该泛型类型。e、 g

public class ExampleManager<T extends Example> {

    public T getExample() {
        return new T("example","example"); // So what exactly goes here?
    }
}
公共类示例管理器{
公共T getExample(){
return new T(“example”,“example”);//那么这里到底是什么呢?
}
}
那么,我在哪里返回我的泛型类型呢?我如何让它真正正常工作,并将
Example
转换为
classA
classB


非常感谢

您不能使用泛型类型来实例化新对象(即,您不能执行
newt(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);
     }
}
公共抽象类ExampleManager{
公共摘要T getExample(字符串x,字符串y);
}
公共类类管理器扩展了ExampleManager{
public ClassA getExample(字符串x、字符串y){
返回新的ClassA(x,y);
}
}
公共类ClassBManager扩展了ExampleManager{
公共类B getExample(字符串x、字符串y){
返回新的ClassB(x,y);
}
}

duplicate您正在寻找具体化的泛型。这在Java中不受支持。C#支持它。在Java中,泛型只是编译时。查找工厂模式,请参阅上面的复制问题链接以获得正确答案。@BalusC:您看到如何在此处应用工厂模式了吗?我只是不知道如何在工厂中实现
E create()
方法(来自Tom Hawtin-tackline answer)@Roman:要么通过反射(
Class#newInstance()
甚至抓取构造函数),要么仅仅使用
new
关键字。工厂模式只是为了将其抽象出来(这是OP的意图)。