gpt4 book ai didi

基于返回类型的 Java 泛型转换?

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:22 26 4
gpt4 key购买 nike

以下代码来自名为 ButterKnife 的 Android 库。我正在弄清楚它是如何工作的。

@SuppressWarnings("unchecked") // That's the point.
public <T> T castParam(Object value, String from, int fromPosition, String to, int toPosition) {
try {
return (T) value;
} catch (ClassCastException e) {
throw new IllegalStateException("Parameter #"
+ (fromPosition + 1)
+ " of method '"
+ from
+ "' was of the wrong type for parameter #"
+ (toPosition + 1)
+ " of method '"
+ to
+ "'. See cause for more info.", e);
}
}

我试图重新创建此函数的行为:

  @SuppressWarnings("unchecked")
public static <T> T cast(Object o){
try {
return (T) o;
} catch (ClassCastException e){
throw new AssertionError("Error");
}
}

和用法:

Object o = new String("test");
Double d = cast(o);

但异常并非永远不会被捕获,它会在方法被调用时被抛出。这是为什么?

此外,这究竟是如何工作的?该方法如何知道要转换成什么?

最佳答案

由于类型删除,泛型类型仅在编译时检查。这样做是因为在 Java 5 的运行时中没有办法在不破坏向后兼容性和强制重新编译所有已经存在的库的情况下引入泛型。

长话短说,当你定义一个“泛型”类或方法时,实际代码被编译为Object,而不是你绑定(bind)方法的类型。所有类型的检查都在编译时完成。

因此,您的方法代码实际上并没有在 return 语句中执行转换,因为它正在将某些内容(String)分配给 Object返回值。实际的 ClassCastException 由调用行返回,因为它是实际键入引用变量的地方。

关于基于返回类型的 Java 泛型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36217857/

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