gpt4 book ai didi

java - 泛型和强制转换

转载 作者:搜寻专家 更新时间:2023-11-01 02:39:25 26 4
gpt4 key购买 nike

我尝试编写一个带有参数名称并可以返回给定对象的相应参数的类。目前,我的类(class)是这样的:

public class ParamValue<T> {

private String paramName;

@SuppressWarnings("unchecked")
public T getValue(Object obj) throws Exception {

Class<?> c = obj.getClass();
Field param = c.getDeclaredField(paramName);
boolean isAccessible = param.isAccessible();
param.setAccessible(true);
Object value = param.get(obj);
param.setAccessible(isAccessible);
return (T) value;
}

// get set ...
}

现在,假设我们有一个带有简单 Long 参数的对象:

public class ExampleClass {

private Long value;

// get set ...
}

我们可以这样做来取回 long 值:

    ExampleClass ec = new ExampleClass();
ec.setValue(12L);

ParamValue<Long> pvString = new ParamValue<>();
pvString.setParamName("value");

// print 12
System.out.println(pvString.getValue(ec));

现在,如果我将“ParamValue”声明为一个点,它仍然有效:

    ExampleClass ec = new ExampleClass();
ec.setValue(12L);

ParamValue<Point> pvPoint = new ParamValue<>();
pvPoint.setParamName("value");

// print 12
System.out.println(pvPoint.getValue(ec));

但是,由于 Point 无法转换为 Long,我预计会出现一些异常,例如 ClassCastException。

我知道 java 编译器在编译时会进行一些类型删除,但我认为编译器会自动尝试转换为 Point,但失败了,转换为“pvPoint.getValue(ec)”的输出

谁能解释一下这是如何工作的?

谢谢

最佳答案

ClassCastException 是一个RuntimeException,这意味着它只会在运行时抛出,而不会在编译时抛出。自贵引用Object value = param.get(obj);是 Object 类型,您的类型转换应该被允许,因为所有类都扩展了 Object。您的 getValue 方法接受任何对象作为参数,因此在编译时,将接受任何类,无论您声明的参数化类型如何。

如果你想要类型安全,你可以将方法的参数声明为<? extends T>然后只允许 T 和扩展它的类进行方法调用。

你也可以这样修改方法:

    public <T> T getValue(Class<T> returnType, Object obj) throws Exception {
Class<?> c = obj.getClass();
Field param = c.getDeclaredField(paramName);
boolean isAccessible = param.isAccessible();
param.setAccessible(true);
Object value = param.get(obj);
param.setAccessible(isAccessible);
return returnType.cast(value);
}

在这种情况下,无需参数化您的类。您甚至可以将上述方法的返回语句修改为如下所示:

     if (returnType.isInstance(value)) {
return returnType.cast(value);
} else {
// could be replaced with a return null
throw new ClassCastException("Exception message");
}

关于java - 泛型和强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37697848/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com