how2j.cn


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



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



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

示例 1 :

不使用泛型

不使用泛型带来的问题
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); } }
示例 2 :

使用泛型

使用泛型的好处:
泛型的用法是在容器后面添加<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); } }
示例 3 :

子类对象

假设容器的泛型是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()); } }
示例 4 :

泛型的简写

为了不使编译器出现警告,需要前后都使用泛型,像这样:

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 :

练习-泛型

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
根据数字类的知识,设计一个集合,这个集合里即可以放整数,也可以放浮点数,但是不能放字符串
示例 6 :

答案-泛型

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


泛型使用Number, 就可以放所有Number的子类,比如Integer,Float,Double

但是不能放String
package generic; import java.util.ArrayList; public class TestGeneric { public static void main(String[] args) { ArrayList<Number> numbers = new ArrayList<>(); numbers.add(123);//int numbers.add(123f);//float numbers.add(123d);//double numbers.add("String"); } }
package generic;
   
import java.util.ArrayList;
   
public class TestGeneric {
   
    public static void main(String[] args) {
        ArrayList<Number> numbers = new ArrayList<>();
        numbers.add(123);//int
        numbers.add(123f);//float
        numbers.add(123d);//double
        
        numbers.add("String");
        
    }
      
}



问答区域    
2017-09-16 疑惑
游息宴
老大 集合中的泛型和后面所讲的泛型不一样吗 这个是定义了number 基本数据类型的可以放进去 string的放不进去 那也不是泛型啊 泛型不是什么类型的都能放进去吗 求解




1 个答案

how2j 答案时间:2017-09-18
“泛型不是什么类型的都能放进去吗” 没有这个说法哦,如果是这样,那么为什么还要泛型呢? 泛型主要就是约束一个容器只能放什么样类型的对象哦




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2017-03-31 不是AD是物理,AP是魔法?
cyc
不是AD是物理,AP是魔法?




1 个答案

how2j 答案时间:2017-04-01
嗯,搞反了,谢谢指正




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到








提问之前请登陆
关于 JAVA 中级-泛型-集合中的泛型 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 661682521
站长会在每个工作日早上尽量回答提问(如果有漏掉没有回答的,请进群提醒一下)
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
站长是玻璃心,提问的时候请语气温柔些 kiss~
截止2017-5-19日累计提问 1638个,站长回答了 1546个
截止2017-8-15日累计提问 2788个,站长回答了 2544个

上传截图