假设我有:
ClassA extends SuperClass{ ...}
ClassB extends SuperClass{ ... }
也ClassX<T extends SuperClass> { ... }
现在,在运行时我遇到了一个我知道应该是ClassA或ClassB的对象。我想基于此创建一个ClassX实例。我怎么能这样做?
我试过了:
Class<?> className = object.getClass();
Class<className> objectx = ...
哪个不起作用。
提前致谢!
答案 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 ) {...}
}