本帖最后由 TristenC 于 2021-3-18 15:40 编辑
[Java] 纯文本查看 复制代码 @Test
public void testGeneric(){
/*
* 已知的知识:
* 假设类G是泛型类,那么对于G<A>与G<B>来说,不管类A与类B是否具有继承关系
* G<A>与G<B>都视作两个彼此独立完全没有任何关系的类型,即G<A>对象与G<B>对象的引用无法互相赋值
* 就像一个String类型对象的引用无法赋值给一个声明为Date类型的变量,反之亦然
* 但是G<A>对象与G<B>对象的引用都可以赋值给声明为G<?>的变量
* 因为G<?>可看作G<A>与G<B>的父类,G<?>甚至可以看作G<Object>的父类
*
* 问题:
* 以下代码的前3行是没问题的,set对象的引用遵循上述说法可以赋给变量set1
* 可是第4行代码会编译报错(类型不匹配无法转换):Type mismatch: cannot convert from Set<Map.Entry<String,Integer>> to Set<Map.Entry<?,?>>
* 声明变量set2时只是指明了第一层泛型为"Map.Entry",第二层泛型未指明而使用通配符"?,?"
* 只看第二层泛型的话:等号左边是Map.Entry<?,?>,等号右边是Map.Entry<String, Integer>,遵循G<?>与G<A>的形式,可是为什么会编译报错?
*/
Map<String,Integer> map = new HashMap<>();
Set<Map.Entry<String, Integer>> set = map.entrySet();
Set<?> set1 = set;
Set<Map.Entry<?,?>> set2 = set;//此行编译报错
} |