我目前遇到了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
- 类?使用if
无法使用instanceof
- 级联,因为可能存在许多可能性。
答案 0 :(得分:3)
您可以按create()
参数化K
方法(只是为了避免与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
答案 1 :(得分:1)
不,你不能那样做。泛型的类型信息在编译时被删除。您用作类型参数的类型必须为编译器所知。任何为您提供引用的运行时类型的表达式都将仅在运行时进行计算,此时设置类型参数为时已晚。
答案 2 :(得分:1)
在运行时,所有通用参数都将被删除,所有参数都为Object
。
在编译时,编译器会检查实例上使用的方法是否是该实例的泛型类型。
ArrayList<o.getType()> s
没有意义,因为在编译时,javac需要知道它是否应该出错,如下所示:
s.get(0).intValue()
如果o
为Integer
,如果是String
怎么办?
答案 3 :(得分:-2)
如果您需要为明确的少量类创建正确的泛型类型,则可以使用instanceof
运算符...类似
if (o instanceof T) { x = new Something<T>();}
else if (o instanceof String) {x = new Something<String>();}
else if ....