繁体   English   中英

用Java转换通用类型(例如T值=(T)inputParam)

[英]Casting Generic Types in Java (e.g. T value = (T) inputParam)

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

我需要从对象到通用类型T进行类型转换。

T值=(T)参数;

这是我的示例代码。

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”中的值仍然是字符串。

我的问题是如何实现我想要的。 我向方法getValue()发送字符串“ 12.45”的原因是因为该数据不受我控制。 外部应用程序需要使用我的通用类,并且由于某些原因,它们发送值“ 12.45”的String表示形式。 因此,我的课程可以处理整数,浮点数,双精度数或其他任何值。

关键是,强制转换实际上不能更改对象的类型。 它可以通过它已经属于的任何类型来引用对象-但它不能更改实际类型。

String不是Double ,因此不能将StringDouble 您需要调用Double.valueOf()

您不能 String转换为Double 您必须转换值。 强制转换的意思是告诉JVM,一个已知属于一个超类型的对象实际上是一个子类型的对象,而事实并非如此。

相反,知道该值是String并希望将其作为Double需要使用Double.valueOf(stringVariable)。

只是粗略的,但是您可以使用(1)所需的Class,(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");

暂无
暂无

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

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