[英]getClass() of a generic method parameter cast safety
这个演员安全吗?
private <T> void foo(T value) {
final Class<T> aClass = (Class<T>) value.getClass();
}
是否存在更优雅的方式来执行此操作?
是否可以避免未经检查的投放警告?
您可以禁止编译器警告。 请参阅什么是Java中的SuppressWarnings(“未选中”)?
编译器出于某种原因警告您。 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!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.