how2j.cn

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



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



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

不指定泛型的容器,可以存放任何类型的元素
指定了泛型的容器,只能存放指定类型的元素以及其子类
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); } }
为了不使编译器出现警告,需要前后都使用泛型,像这样:

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 :

泛型的系统学习

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

练习-支持泛型的ArrayList

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

答案-支持泛型的ArrayList

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2019-05-15 思考了一下
NoColor
以为没有想象中给hero和item共同创建一个父类这么简单, 打开答案一看,还真就是这样...亏了4积分,哭唧唧...







回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2019-05-10 交作业
hx1176406648



做了两次,第一次是对ArrayList的方法进行重写,但是如果要获取对象还是会出现类转换错误,看了下大家的代码,写了个抽象类,其他两个类继承并实现方法。
package middleGrade;

import java.util.ArrayList;

public class ArrayListStrength2 {
//利用泛型在ArrayList加入两种不同的类型并且可以获取对象,为了对获取的对象不产生转换错误,因此使用多态,父类引用指向子类对象。
	static abstract class HeroItem{
		String name;
		
		public HeroItem(String name){
			this.name = name;
		}
		
		public abstract void disapper();
		
		public String toString(){
			return this.name;
		}
	}
	
	class Hero extends HeroItem{

		public Hero(String name) {
			super(name);
		}

		@Override
		public void disapper() {
			System.out.println(this.name + "啊,我死了!");
		}
	}
	
	class Item extends HeroItem{

		public Item(String name) {
			super(name);
		}

		@Override
		public void disapper() {
			System.out.println(this.name + "没了,我的宝贝没得了");
		}
	}
	
	public static void main(String[] args) {
		ArrayList<HeroItem> heroItem = new ArrayList<>();
		
		heroItem.add(new ArrayListStrength2().new Hero("盖伦"));
		heroItem.add(new ArrayListStrength2().new Item("回血包"));
		
		HeroItem hi1 = heroItem.get(0);
		HeroItem hi2 = heroItem.get(1);
		
		hi1.disapper();
		hi2.disapper();
		System.out.println();
		System.out.println();
	}
}

							





回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2019-05-03 使用接口也可以吧
2019-04-29 这样也可以吧
2019-04-29 旋转跳跃
2019-01-24 交作业
2018-11-25 交作业
2018-09-20 泛型添加的是对象的属性吗?
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群交流: 1001964108
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图