[英]How to set type of generic Java class at runtime?
我目前遇到Java泛型的问题,其中必须在运行时确定参数T的类型。
这是具有类型参数T的类:
public class Something<T> {
T value;
public Something(T value) {
this.value = value;
}
... //some other methods
}
这是另一个类中的方法,应在其中创建Something
的实例,但其中T的类型取决于给定对象的动态类型:
public void create(Object o) {
//this is not working, since there is no getType() method
Something<o.getType()> s = new Something();
}
有没有一种方法可以确定o的动态类型并将其作为类型参数传递给Something
-class? 不能通过instanceof
使用if
-cascade,因为o可能有很多可能性。
您可以用K
参数化create()
方法(只是为了避免与T
混淆)
public <K> void create(K o) {
Something<K> s = new Something<K>();
}
然后,当您多次调用create()
方法时,将发生以下情况:
create(Object o) -> will parametrize Something by Object
create(Integer i) -> will instantiate Something by Integer
不,你不能那样做。 泛型的类型信息在编译时被擦除。 用作类型参数的类型对于编译器必须是已知的。 任何为您提供引用的运行时类型的表达式,只有在为时已晚而无法设置type参数时,才会在运行时求值。
在运行时,所有通用参数都将被擦除,并且所有Object
都是Object
。
在编译时,编译器检查实例上使用的方法是否是该实例的通用类型的方法。
ArrayList<o.getType()> s
是没有意义的,因为在编译时,javac需要知道是否应该对以下内容进行错误处理:
s.get(0).intValue()
如果o
是Integer
怎么办,如果它是String
呢?
如果您需要为少量的类创建正确的泛型类型,则可以使用instanceof
运算符...类似
if (o instanceof T) { x = new Something<T>();}
else if (o instanceof String) {x = new Something<String>();}
else if ....
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.