运行时通用类型Java

时间:2013-07-30 13:12:35

标签: java generics runtime

假设我有:

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

ClassX<T extends SuperClass> { ... }

现在,在运行时我遇到了一个我知道应该是ClassA或ClassB的对象。我想基于此创建一个ClassX实例。我怎么能这样做?

我试过了:

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

哪个不起作用。

提前致谢!

3 个答案:

答案 0 :(得分: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()//现在你得到的是ClassA或ClassB的Object

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

答案 1 :(得分:0)

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

答案 2 :(得分: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 ) {...}
}