繁体   English   中英

Java的继承,泛型和转换

[英]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正常工作并将ExampleclassAclassB

非常感谢

您不能使用泛型类型来实例化新对象(即,您不能执行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM