在Java中转换泛型类型(例如T值=(T)inputParam)

时间:2014-02-06 11:37:25

标签: java generics casting

我有一个非常简单的问题,但似乎没有人回答过它。

我需要从对象转换为泛型类型T. 这样的事情。

T值=(T)param;

这是我的示例代码。

public class App {
  public static void main(String[] args) {
      MyGeneric<Double> myGeneric = new MyGeneric();
      Object obj = myGeneric.getValue("12.45");
  }
}

public class MyGeneric<T> {
  public T getValue(Object value) {
      return (T) value;
  }
}

我有一个类的泛型类,以及一个接收Object作为参数并返回相同对象的方法。

我希望我的班级自动从“12.45”投射到双倍值12.45。但是,我的班级什么也没做。最后,变量“obj”中的值仍然是String。

我的问题是如何实现我想要的。我将字符串“12.45”发送到我的方法getValue()的原因是因为该数据不是由我控制的。外部应用程序需要使用我的泛型类,并且由于某种原因,它们发送值为“12.45”的字符串表示形式。所以我的班级可以处理整数,浮点数,双精度或任何东西。

3 个答案:

答案 0 :(得分:5)

事实是,一个演员实际上不能改变一个对象的类型。它可以通过它已经属于的任何类型引用该对象 - 但它不能改变实际类型。

String不是Double,因此您无法将String投射到Double。您需要致电Double.valueOf()

答案 1 :(得分:4)

你不能施放 StringDouble;你必须转换价值。转换意味着告诉JVM一个已知属于一个超类型的对象实际上是一个子类型的对象,而这不是这里的情况。

相反,知道该值的代码是String,并希望它是Double需要使用`Double.valueOf(stringVariable)。

答案 2 :(得分:0)

只是粗略,但你可以使用(1)所需的类,(2)反射

public static <T> T getValue(Class<T> klazz, Object value) {
    try {
        // Try whether value has correct type:
        return klazz.cast(value);
    } catch (ClassCastException e) {
        // Try whether klazz has static .valueOf(String)

        // Then value not null:
        String s = value.toString();
        Method valueOf = klazz.getDeclaredMethod("valueOf", String.class);
        int modifiers = valueOf.getModifiers();
        if (Modifiers.isStatic(modifiers)) {
            valueOf.setAccessible(true);
            return valueOf.invoke(null, s);
        }
    }
    throw new IllegalArgumentException(value);
}

double x = getValue(Double.class, "12.34");