本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
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<>(); } }
借助泛型和前面学习的面向对象的知识,设计一个ArrayList,使得这个ArrayList里,又可以放Hero,又可以放Item,但是除了这两种对象,其他的对象都不能放
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
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
答案
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
我的答案
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 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|