2013-07-30 82 views
1

假设我有:运行时泛型类型的Java

ClassA extends SuperClass{ ...} 
ClassB extends SuperClass{ ... } 

ClassX<T extends SuperClass> { ... }

现在,运行过程中我接触过的物体,我知道应该是ClassA的或ClassB的之一。我想创建一个基于ClassX的实例。我怎样才能做到这一点?

我曾尝试:

Class<?> className = object.getClass(); 
Class<className> objectx = ... 

不工作。

在此先感谢!

+1

在比较过程中,所有的泛型将被Object替换。这就是为什么你不能在运行时选择通用类型。 – pad

回答

0

ClassX<SuperClass> myObj = new ClassX<SuperClass>();

有了一个通用类,你刚才说,你可以在那类是通用型

ClassX<T extends SuperClass>{ 
    public T value; // its just public so i dont need a setter 
} 

现在你可以做一个值: theObjectThatIsAOrB = xy.get( )//现在你得到你的Object,它是ClassA或ClassB

ClassX<SuperClass> myObj = new ClassX<SuperClass>(); 
myOjb.value = theObjectThatIsAOrB; 
0

这是不可能的,因为它没有任何意义。想一想,如果你能做到这一点,它会有什么好处呢?类型参数的唯一目的是在编译时进行类型检查。所以如果你有一个你在编译时不知道的类型参数,它不能输入check,也不能做任何事情;因此,首先将类型参数放在首位是毫无意义的。 (使用通配符将没有什么不同。)

0

如果编译器可以知道涉及哪个A或B,只需使用new。

public <T extends SuperClass> ClassX <T> makeClassXInstance(T aOrB) { 
    return new ClassX<T>(); 
} 

另一方面,如果您正在寻找在运行时确定类,类似这样的东西可能会起作用。但是你遇到了变体类型问题。 Java很难解决它。

public <T extends SuperClass> ClassX <T> makeClassXInstance(T aOrB) { 
    return new ClassX<T>(aOrB.getClass()); 
} 

public class ClassX<T>{ 
    public ClassX(Class<T> cls) {...} 
}