如何在运行时设置通用Java类的类型?

时间:2014-02-26 15:51:52

标签: java generics

我目前遇到了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 - 级联,因为可能存在许多可能性。

4 个答案:

答案 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()

如果oInteger,如果是String怎么办?

答案 3 :(得分:-2)

如果您需要为明确的少量类创建正确的泛型类型,则可以使用instanceof运算符...类似

  if (o instanceof T) { x = new Something<T>();}
  else if (o instanceof String) {x = new Something<String>();}
  else if ....