how2j.cn

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



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



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

答案-支持泛型的ArrayList

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

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


首先创建一个接口 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公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2022-02-26 答案
木木12




111111111
public class Hero {

	String name;
	double hp;
	
	public static void main(String[] args) {
		
		
		List<Hero> list = new ArrayList<Hero>();
		list.add(new Hero());
		list.add(new Item());
		
		//list.add(new Dad());//测试其他对象是否能添加
	}
}

class Item extends Hero{
	String color;
}


class Dad{}

							


3 个答案

木宇
答案时间:2024-07-09
打卡 思路一个父类两个子类

wr123
答案时间:2023-11-23
package ArrayList; import charactor.Hero; import property.Item; import java.util.ArrayList; public class MyArrayList extends ArrayList { @Override public boolean add(Object o) { if ((o instanceof Hero) || (o instanceof Item)) { return super.add(o); } else { System.out.println("所添加的类不符合要求,请选择Hero或者Item对象添加"); return false; } } @Override public void add(int index, Object element) { if ((element instanceof Hero) || (element instanceof Item)) { super.add(index, element); } else System.out.println("该对象不是Hero或者Item及其子类,添加失败"); } } 测试 package collection; import java.util.ArrayList; import ArrayList.MyArrayList; import charactor.Hero; import property.Item; public class TestCollection { public static void main(String[] args) { MyArrayList myArrayList=new MyArrayList(); Hero hero=new Hero("盖伦"); Item item=new Item("红水晶"); MyArrayList lgu=new MyArrayList(); //用于验证 System.out.println(myArrayList.add(hero)); System.out.println(myArrayList.add(item)); System.out.println(myArrayList.add(lgu)); System.out.println(myArrayList.toString()); } }

zhushu
答案时间:2022-11-17
和我想的类似。设计一个父类作为hero和item的父类。然后arrayList后面的类型为父类。这样合理不?



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





2021-07-06 我的答案
Amanda




我的答案啊
public class HeroItemList extends ArrayList {
    public boolean canAdd(Object o) {
        return o instanceof Hero || o instanceof Item;
    }

    @Override
    public boolean add(Object o) {
        return this.canAdd(o) && super.add(o);
    }

    @Override
    public void add(int index, Object element) {
        if (this.canAdd(element)) {
            super.add(index, element);
        }
    }
}

							


3 个答案

zjlilil
答案时间:2023-04-14
这个类继承了ArrayList类,并重写了add方法。在add方法中,判断传入的对象是否为String或Integer类型,如果是,则调用父类的add方法添加到ArrayList中;否则抛出异常。这样就实现了只能存放String和Integer类型数据的ArrayList。

蔚蓝天空157
答案时间:2022-08-07
妙蛙!

theCarrot
答案时间:2022-02-24
太牛了



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





2021-06-22 练习-支持泛型的ArrayList
2021-01-25 Lists.newArrayList()也行
2020-11-05 答案一:继承ArrayList,再重写方法add 实现了要求


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 20 条以前的提问,请 点击查看

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

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

上传截图