how2j.cn

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



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



步骤 1 : 泛型 Generic   
步骤 2 : 泛型的简写   
步骤 3 : 泛型的系统学习   
步骤 4 : 练习-支持泛型的ArrayList   
步骤 5 : 答案-支持泛型的ArrayList   

步骤 1 :

泛型 Generic

不指定泛型的容器,可以存放任何类型的元素
指定了泛型的容器,只能存放指定类型的元素以及其子类
package property; public class Item { String name; int price; public Item(){ } //提供一个初始化name的构造方法 public Item(String name){ this.name = name; } public void effect(){ System.out.println("物品使用后,可以有效果"); } }
package collection; import java.util.ArrayList; import java.util.List; import property.Item; import charactor.APHero; import charactor.Hero; public class TestCollection { public static void main(String[] args) { //对于不使用泛型的容器,可以往里面放英雄,也可以往里面放物品 List heros = new ArrayList(); heros.add(new Hero("盖伦")); //本来用于存放英雄的容器,现在也可以存放物品了 heros.add(new Item("冰杖")); //对象转型会出现问题 Hero h1= (Hero) heros.get(0); //尤其是在容器里放的对象太多的时候,就记不清楚哪个位置放的是哪种类型的对象了 Hero h2= (Hero) heros.get(1); //引入泛型Generic //声明容器的时候,就指定了这种容器,只能放Hero,放其他的就会出错 List<Hero> genericheros = new ArrayList<Hero>(); genericheros.add(new Hero("盖伦")); //如果不是Hero类型,根本就放不进去 //genericheros.add(new Item("冰杖")); //除此之外,还能存放Hero的子类 genericheros.add(new APHero()); //并且在取出数据的时候,不需要再进行转型了,因为里面肯定是放的Hero或者其子类 Hero h = genericheros.get(0); } }
步骤 2 :

泛型的简写

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

List<Hero> genericheros = new ArrayList<Hero>();

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

List<Hero> genericheros2 = new ArrayList<>();

后面的泛型可以用<>来代替,聊胜于无吧
package collection; import java.util.ArrayList; import java.util.List; import charactor.Hero; public class TestCollection { public static void main(String[] args) { List<Hero> genericheros = new ArrayList<Hero>(); List<Hero> genericheros2 = new ArrayList<>(); } }
package collection;
  
import java.util.ArrayList;
import java.util.List;

import charactor.Hero;
  
public class TestCollection {
 
    public static void main(String[] args) {
        List<Hero> genericheros = new ArrayList<Hero>();
        List<Hero> genericheros2 = new ArrayList<>();
     
    }
      
}
步骤 3 :

泛型的系统学习

泛型的知识还包含 支持泛型的类 泛型转型 通配符 这些内容都在泛型章节详细展开
步骤 4 :

练习-支持泛型的ArrayList

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
借助泛型和前面学习的面向对象的知识,设计一个ArrayList,使得这个ArrayList里,又可以放Hero,又可以放Item,但是除了这两种对象,其他的对象都不能放
步骤 5 :

答案-支持泛型的ArrayList

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

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


首先创建一个接口 LOL,不需要在其中声明任何方法
接着让Hero和Item都实现LOL接口
最后,声明一个ArrayList的变量lolList,它的泛型是<LOL>

List<LOL> lolList = new ArrayList<>();

这样在lolList中就即放Hero对象,又放Item对象了。
package charactor; public interface LOL { }
package charactor; public class Hero implements LOL { public String name; public float hp; public int damage; public Hero() { } public Hero(String name) { this.name = name; } public String toString() { return name; } }
package property; import charactor.LOL; public class Item implements LOL { String name; int price; public Item(){ } public Item(String name){ this.name = name; } public void effect(){ System.out.println("物品使用后,可以有效果"); } public boolean disposable() { return false; } }
package collection; import java.util.ArrayList; import java.util.List; import charactor.GiantDragon; import charactor.Hero; import charactor.LOL; import property.Item; public class TestCollection { public static void main(String[] args) { List<LOL> lolList = new ArrayList<>(); lolList.add( new Hero("盖伦")); //能放Hero lolList.add( new Item("血瓶")); //也能放Item lolList.add(new GiantDragon()); // GiantDragon即不是Hero也不是Item } }


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


问答区域    
2018-11-25 交作业
夜的诗人



参考之前同学的思路,为Hero 跟 item 做了一个共同的父类 heroItem
package Framework;
import java.util.*;
import charactor.soldier;
import charactor.APHero;
import charactor.Item;
import charactor.Hero;
import charactor.heroItem;//hero 跟 item 共同的父类
public class fanxingGenericPractice {
	public static void main(String[] args) {
		List<heroItem>lolList=new ArrayList<>();
		lolList.add(new Hero("盖伦"));//也能放Hero
		lolList.add(new Item("血瓶"));//也能放Item
		
		lolList.add(new soldier("超级兵"));//士兵类对象不能存放
		
	}
}

							






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





2018-09-20 泛型添加的是对象的属性吗?
yingge



调用Hero类的构造方法new Hero("盖伦")是指属性还是对象呢
heros.add(new Hero("盖伦"))

							


1 个答案

爆浆田螺 答案时间:2018-10-09
添加个对象,并将对象的name属性赋值




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





2018-08-23 如何给list里面的对象赋值啊
2018-07-30 交作业
2018-06-20 为Item类和Hero类做了一个父类,发现好像也没问题
2018-06-20 为Item类和Hero类做了一个父类,发现好像也没问题
2018-01-11 关于练习题的思路
2018-01-11 关于练习题的思路
2017-10-15 上面说泛型可以放入类型的子类,实现了接口的类 也相当子类吗?
2017-08-21 练习相关问题
2017-08-18 练习问题
2017-08-15 泛型 简写




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

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

上传截图