Generit类的类型阻止检查泛型类型的参数(编译和运行时)

时间:2017-03-27 08:51:42

标签: java generics casting

我将带有泛型类型的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)。问题中的详细信息,结果证明是重复的。

0 个答案:

没有答案