有一个特定的通用接口和一个实现它的类。
interface Contract<T> {
void doIt(T arg);
}
class Impl implements Contract<Integer> {
@Override
public void doIt(Integer arg) {
System.out.println("hi");
}
}
当创建一个实例Impl并调用这样的方法时
Contract obj = new Impl();
obj.doIt(42);
编译器礼貌地警告 Unchecked call ... 。
我得出以下结论 - 编译器不会查看实际会调用哪个类方法。在这里,他看着他们Contract#doIt(T arg)正在拉动的东西,并警告说有必要转移类型。并且将类型转移到将完成所有工作的类的事实对其隐藏。
我理解正确吗?
这里的底线是你没有明确指出泛型中将是什么类型,也就是说,编译器不知道它,这在运行时充满了错误。也就是说,在你提供的代码中,你可以这样写:
但是当你运行这段代码时,你会得到
ClassCastException. 为什么?因为在方法参数中泛型的情况下,编译器会创建所谓的桥接方法,编译后您的类Impl将有 2 个方法:实际上,它会发出警告,因为如果你这样写:
那么传递给这个桥接方法的参数将在编译时被检查并防止你在脚下开枪。
我建议