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-06-20 为Item类和Hero类做了一个父类,发现好像也没问题
leeoy



没有用接口,而是为Item类和Hero类做了一个父类,发现好像也没问题
package hybird;

public class HeroItem{
}

//------------------------------------------------------------------------------------------------------------------------------------------------

package character;
import hybird.HeroItem;

public class Hero extends HeroItem {
    public String name;
    public float hp;
    public int damage;

    Hero(){
    }

    public Hero(String name){
        this.name = name;
    }

    public String toString(){
        return name;
    }
}

//------------------------------------------------------------------------------------------------------------------------------------------------

package property;

import hybird.HeroItem;

public class Item extends HeroItem {
    String name;
    int price;


    public Item(){

    }


    //提供一个初始化name的构造方法
    public Item(String name){
        this.name = name;
    }

    public void effect(){
        System.out.println(this.name + "物品使用后, 可以有效果");
    }
}

//------------------------------------------------------------------------------------------------------------------------------------------------

        //练习:借助泛型和前面学习的面对对象的知识,设计一个ArrayList,使得这个ArrayList里,
        //又可以放Hero,又可以放Item,但是除了这两种对象,其他的对象都不能放。

        List<HeroItem> heroes_items = new ArrayList<>();
        heroes_items.add(new Hero("盖伦"));
        heroes_items.add(new Item("反曲之弓"));
        System.out.println( heroes_items.get(0).toString());
        Item item1  =  (Item)heroes_items.get(1);
        item1.effect();


        heroes_items.add(new APHero());

							


1 个答案

leeoy 答案时间:2018-06-20
APHero类是Hero的子类。 在父类实现,和接口实现里发现,这种总实现方法都可以放APHero




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





2018-06-20 为Item类和Hero类做了一个父类,发现好像也没问题
leeoy



没有用站长说的接口,而是加了一个父类实现的练习。 如果有错,或者这种方法有什么不足的地方,还请回复一下
package hybird;
public class HeroItem{
}

----------------------------------------------------------------------------------------------------------------------------------

package character;

import hybird.HeroItem;

public class Hero extends HeroItem {
    public String name;
    public float hp;
    public int damage;

    Hero(){
    }

    public Hero(String name){
        this.name = name;
    }

    public String toString(){
        return name;
    }
}


----------------------------------------------------------------------------------------------------------------------------------

package property;

import hybird.HeroItem;

public class Item extends HeroItem {
    String name;
    int price;


    public Item(){
    }

    //提供一个初始化name的构造方法
    public Item(String name){
        this.name = name;
    }

    public void effect(){
        System.out.println(this.name + "物品使用后, 可以有效果");
    }
}


----------------------------------------------------------------------------------------------------------------------------------
        //练习:借助泛型和前面学习的面对对象的知识,设计一个ArrayList,使得这个ArrayList里,
        //又可以放Hero,又可以放Item,但是除了这两种对象,其他的对象都不能放。

        List<HeroItem> heroes_items = new ArrayList<>();
        heroes_items.add(new Hero("盖伦"));
        heroes_items.add(new Item("反曲之弓"));
        System.out.println( heroes_items.get(0).toString());
        Item item1  =  (Item)heroes_items.get(1);
        item1.effect();


        heroes_items.add(new APHero());

							






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





2018-01-11 关于练习题的思路
2018-01-11 关于练习题的思路
2017-10-15 上面说泛型可以放入类型的子类,实现了接口的类 也相当子类吗?
2017-08-21 练习相关问题
2017-08-18 练习问题
2017-08-15 泛型 简写




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

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

上传截图