【问题标题】:Inheritance, Generics and Casting in JavaJava中的继承、泛型和强制转换
【发布时间】:2010-04-15 20:29:43
【问题描述】:

我有两个课程都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?
    }
}

那么我在哪里返回我的泛型类型,我如何让它真正正常工作并将Example 转换为classAclassB

非常感谢

【问题讨论】:

  • 您正在寻找具体化的泛型。这在 Java 中不受支持。 C# 支持它。在 Java 中,泛型只是编译时。查找工厂模式,请参阅上面的链接以重复问题以获取正确答案。
  • @BalusC:你知道如何在这里应用工厂模式吗?我只是不明白如何在 Factory 中实现 E create() 方法(来自 Tom Hawtin - tackline answer stackoverflow.com/questions/75175/…
  • @Roman:通过反射(Class#newInstance() 甚至获取构造函数)或仅使用 new 关键字。工厂模式只是为了抽象出来(这是 OP 的意图)。

标签: java generics inheritance casting


【解决方案1】:

您不能使用泛型类型来实例化新对象(即您不能这样做new T(params))。

【讨论】:

    【解决方案2】:

    当您创建对象的具体实例时(即您使用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"); 
        }
    }
    

    【讨论】:

      【解决方案3】:

      正如其他人所说,您不能使用 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);
           }
      }
      

      【讨论】:

        猜你喜欢
        • 2010-11-30
        • 2019-09-13
        • 1970-01-01
        • 2017-06-16
        • 1970-01-01
        相关资源
        最近更新 更多