2010-04-15 137 views
0

我有两个类都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为任何classAclassB

非常感谢

+0

复制http://stackoverflow.com/questions/75175/create-instance-of-generic-type-in​​-java – unholysampler 2010-04-15 20:35:23

+1

你正在寻找*具体化泛型*。这在Java中不受支持。 C#支持它。在Java中,泛型只是编译时。查找工厂模式,请参阅上述链接以复制正确答案的问题。 – BalusC 2010-04-15 20:54:37

+0

@BalusC:你看到如何在这里应用工厂模式?我只是没有得到如何在工厂实现'E create()'方法(来自汤姆霍金 - tackline回答http://stackoverflow.com/questions/75175/create-instance-of-generic-type-in​​-java/75528#75528) – Roman 2010-04-15 21:17:33

回答

1

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

1

当您创建对象的具体实例(即,您使用新的)时,您已知道实际的实现类,不能使用泛型类型。

你究竟在努力实现什么?你如何决定是否要创建ClassA或ClassB?

试试这个:

public class ExampleManager { 
    public ClassA createClassA() { 
     return new ClassA("example","example"); 
    } 

    public ClassB createClassB() { 
     return new ClassB("example","example"); 
    } 
} 

或本:

​​
0

正如其他人所说,你不能使用新创建未知类型的新实例。如果不使用反射,可以使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); 
    } 
}