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

在Java中强制转换泛型类型(例如,T值=(T)inputParam),java,generics,casting,Java,Generics,Casting,我有一个非常简单的问题,但似乎以前没有人回答过 我需要将对象转换为泛型类型T。 像这样的 T值=(T)参数 下面是我的示例代码 public class App { public static void main(String[] args) { MyGeneric<Double> myGeneric = new MyGeneric(); Object obj = myGeneric.getValue("12.45"); } } public cla

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

我需要将对象转换为泛型类型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;
  }
}
公共类应用程序{
公共静态void main(字符串[]args){
MyGeneric MyGeneric=新建MyGeneric();
objectobj=myGeneric.getValue(“12.45”);
}
}
公共类MyGeneric{
公共T getValue(对象值){
返回(T)值;
}
}
我有一个类型为的泛型类和一个方法,该方法接收一个对象作为参数,并将相同的对象转换为

我希望我的类自动从“12.45”转换为双倍值12.45。然而,我们班什么也不做。最后,变量“obj”中的值仍然是字符串


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

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

String
不是
Double
,因此不能将
String
强制转换为
Double
。您需要调用
Double.valueOf()
您不能将
字符串
强制转换为
Double
;您必须转换该值。强制转换意味着告诉JVM一个已知为一个超类型的对象实际上是一个子类型的对象,而这里的情况并非如此


相反,如果您的代码知道值是
字符串,并且希望它是
双精度
,则需要使用`Double.valueOf(stringVariable)。

只是粗略地描述一下,但您可以使用(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");
publicstatict getValue(类klazz,对象值){
试一试{
//请尝试值的类型是否正确:
返回klazz.cast(值);
}catch(ClassCastException e){
//尝试klazz是否具有static.valueOf(字符串)
//则值不为空:
字符串s=value.toString();
方法valueOf=klazz.getDeclaredMethod(“valueOf”,String.class);
int modifiers=valueOf.getModifiers();
if(修饰符.isStatic(修饰符)){
setAccessible的值(true);
返回.invoke的值(null,s);
}
}
抛出新的IllegalArgumentException(值);
}
double x=getValue(double.class,“12.34”);

你只想处理数值吗?谢谢你的回答,我明白了。因此,如果我必须处理不同类型的输入,即整数、浮点、双精度等,我需要为每个可能的值创建不同的方法。@user3279112无论接受输入的代码是什么,都必须根据编程策略将其从字符流转换为适当的类型(例如,调用
valueOf
,使用
扫描仪等)。感谢您的回复,我将修改我的方法,改为使用valueOf。如果您要解决所有这些问题,您最好使用弹簧式转换器之类的工具。