吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1698|回复: 3
收起左侧

[已解决] 【Java】泛型使用通配符时的引用赋值问题

[复制链接]
TristenC 发表于 2021-3-14 10:39
本帖最后由 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;//此行编译报错
        }

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

52changew 发表于 2021-3-14 11:53
帮你顶一下; Java的; 不是很懂; 楼下; 大老; 懂的; 回答一下把!
vindamo 发表于 2021-3-16 21:21
Set<Map.Entry<?,?>> set2 = set;//此行编译报错
当java编译成class文件时,会执行类型擦除
类型擦除之后,对于jvm来说,并不知道有Map.Entry 的存在,
这个定义只是约束你在开发时要注意类型一致。

 楼主| TristenC 发表于 2021-3-17 11:58

原来如此,之前只大概知道有类型擦除这个概念并没有深入了解,看来有必要针对性地挖一下了,多谢指点!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 05:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表