gpt4 book ai didi

java - 泛型方法参数强制转换安全性的 getClass()

转载 作者:行者123 更新时间:2023-11-30 01:59:37 24 4
gpt4 key购买 nike

这个 Actor 安全吗?

private <T> void foo(T value) {
final Class<T> aClass = (Class<T>) value.getClass();
}

是否存在更优雅的方法来做到这一点?

是否可以避免未经检查的强制转换警告?

最佳答案

您可以抑制编译器警告。请参阅What is SuppressWarnings ("unchecked") in Java?

编译器警告您是有原因的。 value可以包含 T 某些子类型的对象Class<Parent> 之间存在重要差异和Class<Child> 。在你的例子中,你可以看到你没有做任何不安全的事情,但编译器只是遵循规则。

想象一下,如果方法略有不同,并且有办法获取 T 类型的另一个值:

<T> void foo(T a, T b) {
final Class<T> aClass = (Class<T>) a.getClass();

// What can go wrong? casting T to T
T c = aClass.cast(b);
}

// but what if the two parameters are of different classes at runtime
foo(5, 5.5); // ClassCastException!

或者如果我们允许 Class<T> 会怎么样?作为返回值转义:

<T> Class<T> foo(T val) {
final Class<T> aClass = (Class<T>) val.getClass();
return aClass;
}

// uhoh is declared as Class<Number> but contains Class<Integer> at runtime
Class<Number> uhoh = foo(5);

// Ok to cast Double to Number but not to Integer
Number num = uhoh.cast(5.5); // ClassCastException!

关于java - 泛型方法参数强制转换安全性的 getClass(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53316134/

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