打字猴:1.700446935e+09
1700446935
1700446936 }
1700446937
1700446938 //listMethod接收泛型List参数,并进行重载
1700446939
1700446940 public void listMethod(List<String>stringList){
1700446941
1700446942 }
1700446943
1700446944 public void listMethod(List<Integer>intList){
1700446945
1700446946 }
1700446947
1700446948 }
1700446949
1700446950 程序很简单,编写了4个方法,arrayMethod方法接收String数组和Integer数组,这是一个典型的重载,listMethod接收元素类型为String和Integer的List变量。现在的问题是,这段程序是否能编译?如果不能,问题出在什么地方?
1700446951
1700446952 事实上,这段程序是无法编译的,编译时报错信息如下:
1700446953
1700446954 Method listMethod(List<Integer>)has the same erasure listMethod(List<E>)as
1700446955
1700446956 another method in type Foo
1700446957
1700446958 此错误的意思是说listMethod(List<Integer>)方法在编译时擦除类型后的方法是listMethod(List<E>),它与另外一个方法重复,通俗地说就是方法签名重复。这就是Java泛型擦除引起的问题:在编译后所有的泛型类型都会做相应的转化。转换规则如下:
1700446959
1700446960 List<String>、List<Integer>、List<T>擦除后的类型为List。
1700446961
1700446962 List<String>[]擦除后的类型为List[]。
1700446963
1700446964 List<?extends E>、List<?super E>擦除后的类型为List<E>。
1700446965
1700446966 List<T extends Serializable&Cloneable>擦除后为List<Serializable>。
1700446967
1700446968 明白了这些擦除规则,再看如下代码:
1700446969
1700446970 public static void main(String[]args){
1700446971
1700446972 List<String>list=new ArrayList<String>();
1700446973
1700446974 list.add(“abc”);
1700446975
1700446976 String str=list.get(0);
1700446977
1700446978 }
1700446979
1700446980 经过编译器的擦除处理后,上面的代码与下面的程序是一致的:
1700446981
1700446982 public static void main(String[]args){
1700446983
1700446984 List list=new ArrayList();
[ 上一页 ]  [ :1.700446935e+09 ]  [ 下一页 ]