1

假设我有:

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

ClassX<T extends SuperClass> { ... }

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

我努力了:

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

这是行不通的。

提前致谢!

4

3 回答 3

0

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

于 2013-07-31T00:20:28.513 回答
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 ) {...}
}
于 2013-07-31T00:39:52.123 回答
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

ClassX<SuperClass> myObj = new ClassX<SuperClass>();
myOjb.value = theObjectThatIsAOrB;
于 2013-07-30T13:17:02.197 回答