how2j.cn

本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



3分22秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)



示例 1 : 不使用泛型   
示例 2 : 使用泛型   
示例 3 : 子类对象   
示例 4 : 泛型的简写   
示例 5 : 练习-泛型   
示例 6 : 答案-泛型   

不使用泛型带来的问题
ADHero(物理攻击英雄) APHero(魔法攻击英雄)都是Hero的子类
ArrayList 默认接受Object类型的对象,所以所有对象都可以放进ArrayList中
所以get(0) 返回的类型是Object
接着,需要进行强制转换才可以得到APHero类型或者ADHero类型。
如果软件开发人员记忆比较好,能记得哪个是哪个,还是可以的。 但是开发人员会犯错误,比如第20行,会记错,把第0个对象转换为ADHero,这样就会出现类型转换异常
package generic; import java.util.ArrayList; import charactor.ADHero; import charactor.APHero; public class TestGeneric { public static void main(String[] args) { ArrayList heros = new ArrayList(); heros.add(new APHero()); heros.add(new ADHero()); APHero apHero = (APHero) heros.get(0); ADHero adHero = (ADHero) heros.get(1); ADHero adHero2 = (ADHero) heros.get(0); } }
使用泛型的好处:
泛型的用法是在容器后面添加<Type>
Type可以是类,抽象类,接口
泛型表示这种容器,只能存放APHero,ADHero就放不进去了。
package generic; import java.util.ArrayList; import charactor.APHero; public class TestGeneric { public static void main(String[] args) { ArrayList<APHero> heros = new ArrayList<APHero>(); //只有APHero可以放进去 heros.add(new APHero()); //ADHero甚至放不进去 //heros.add(new ADHero()); //获取的时候也不需要进行转型,因为取出来一定是APHero APHero apHero = heros.get(0); } }
假设容器的泛型是Hero,那么Hero的子类APHero,ADHero都可以放进去
和Hero无关的类型Item还是放不进去
package generic; import java.util.ArrayList; import property.Item; import charactor.ADHero; import charactor.APHero; import charactor.Hero; public class TestGeneric { public static void main(String[] args) { ArrayList<Hero> heros = new ArrayList<Hero>(); //只有作为Hero的子类可以放进去 heros.add(new APHero()); heros.add(new ADHero()); //和Hero无关的类型Item还是放不进去 //heros.add(new Item()); } }
为了不使编译器出现警告,需要前后都使用泛型,像这样:

ArrayList<Hero> heros = new ArrayList<Hero>();

不过JDK7提供了一个可以略微减少代码量的泛型简写方式

ArrayList<Hero> heros2 = new ArrayList<>();

后面的泛型可以用<>来代替,聊胜于无吧
package generic; import java.util.ArrayList; import charactor.Hero; public class TestGeneric { public static void main(String[] args) { ArrayList<Hero> heros = new ArrayList<Hero>(); //后面可以只用<> ArrayList<Hero> heros2 = new ArrayList<>(); } }
package generic;
 
import java.util.ArrayList;

import charactor.Hero;
 
public class TestGeneric {
 
    public static void main(String[] args) {
        ArrayList<Hero> heros = new ArrayList<Hero>();
        //后面可以只用<>
        ArrayList<Hero> heros2 = new ArrayList<>();
        
    }
}
示例 5 :

练习-泛型

练习难度 edit edit Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
根据数字类的知识,设计一个集合,这个集合里即可以放整数,也可以放浮点数,但是不能放字符串
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 中级-泛型-集合中的泛型 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 982790551
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图