繁体   English   中英

运行时通用类型Java

[英]Runtime Generic Type Java

假设我有:

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

同样ClassX<T extends SuperClass> { ... }

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

我努力了:

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

这不起作用。

提前致谢!

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;

这是不可能的,因为这没有意义。 想一想,如果您能做到这一点,它将有什么好处? 类型参数的唯一目的是在编译时进行类型检查。 因此,如果您有一个在编译时不知道的类型参数,它就不能进行类型检查,并且它什么也做不了。 因此,将type参数放在第一位是没有意义的。 (使用通配符没有什么不同。)

如果编译器可以确定涉及到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 ) {...}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM