我将带有泛型类型的List
传递给方法method
。通常,Java会检查这些泛型类型。但是如果该方法在一个本身具有泛型类型的类上,则它不会检测到问题:
import java.util.List;
import java.util.ArrayList;
public class SODemo {
public static void main(String[] args) {
List<ClsAlpha> list = new ArrayList<>();
(new OtherCls()).method(list);
System.out.println(list.get(0));
}
}
// Without this <T> the problem IS detected
class OtherCls<T> {
public void method(List<ClsBeta> list) {
list.add(new ClsBeta());
}
}
class ClsAlpha {}
class ClsBeta {}
对我来说,这段代码编译并运行。如果<T>
被删除,则不会编译。
我对两者感到惊讶:我希望Java能够检测到参数不匹配。我希望,如果它编译,它将引发ClassCastException
(我知道类型信息被删除,但我认为在编译的代码中会有转换)。
任何人都可以启发我吗?
解决方案:如果对象接受泛型类型T
但实例未获得一个,那么所有泛型类型(不仅是T
,还有其他类型因为它的论点被删除了。因此,在代码中,OtherCls
是原始类型,因此public void method(List<ClsBeta> list)
实际上是public void method(List list)
。问题中的详细信息,结果证明是重复的。