how2j.cn

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



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



示例 1 : 不使用泛型   
示例 2 : 使用泛型   
示例 3 : 子类对象   
示例 4 : 泛型的简写   
示例 5 : 练习-泛型   
示例 6 : 答案-泛型   

不使用泛型带来的问题
ADHero(物理攻击英雄) APHero(魔法攻击英雄)都是Hero的子类
ArrayList 默认接受Object类型的对象,所以所有对象都可以放进ArrayList中
所以get(0) 返回的类型是Object
接着,需要进行强制转换才可以得到APHero类型或者ADHero类型。
如果软件开发人员记忆比较好,能记得哪个是哪个,还是可以的。 但是开发人员会犯错误,比如第20行,会记错,把第0个对象转换为ADHero,这样就会出现类型转换异常
package generic; import java.util.ArrayList; import charactor.ADHero; import charactor.APHero; public class TestGeneric { public static void main(String[] args) { ArrayList heros = new ArrayList(); heros.add(new APHero()); heros.add(new ADHero()); APHero apHero = (APHero) heros.get(0); ADHero adHero = (ADHero) heros.get(1); ADHero adHero2 = (ADHero) heros.get(0); } }
使用泛型的好处:
泛型的用法是在容器后面添加<Type>
Type可以是类,抽象类,接口
泛型表示这种容器,只能存放APHero,ADHero就放不进去了。
package generic; import java.util.ArrayList; import charactor.APHero; public class TestGeneric { public static void main(String[] args) { ArrayList<APHero> heros = new ArrayList<APHero>(); //只有APHero可以放进去 heros.add(new APHero()); //ADHero甚至放不进去 //heros.add(new ADHero()); //获取的时候也不需要进行转型,因为取出来一定是APHero APHero apHero = heros.get(0); } }
假设容器的泛型是Hero,那么Hero的子类APHero,ADHero都可以放进去
和Hero无关的类型Item还是放不进去
package generic; import java.util.ArrayList; import property.Item; import charactor.ADHero; import charactor.APHero; import charactor.Hero; public class TestGeneric { public static void main(String[] args) { ArrayList<Hero> heros = new ArrayList<Hero>(); //只有作为Hero的子类可以放进去 heros.add(new APHero()); heros.add(new ADHero()); //和Hero无关的类型Item还是放不进去 //heros.add(new Item()); } }
为了不使编译器出现警告,需要前后都使用泛型,像这样:

ArrayList<Hero> heros = new ArrayList<Hero>();

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

ArrayList<Hero> heros2 = new ArrayList<>();

后面的泛型可以用<>来代替,聊胜于无吧
package generic; import java.util.ArrayList; import charactor.Hero; public class TestGeneric { public static void main(String[] args) { ArrayList<Hero> heros = new ArrayList<Hero>(); //后面可以只用<> ArrayList<Hero> heros2 = new ArrayList<>(); } }
package generic;
 
import java.util.ArrayList;

import charactor.Hero;
 
public class TestGeneric {
 
    public static void main(String[] args) {
        ArrayList<Hero> heros = new ArrayList<Hero>();
        //后面可以只用<>
        ArrayList<Hero> heros2 = new ArrayList<>();
        
    }
}
示例 5 :

练习-泛型

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
根据数字类的知识,设计一个集合,这个集合里即可以放整数,也可以放浮点数,但是不能放字符串
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


泛型使用Number, 就可以放所有Number的子类,比如Integer,Float,Double

但是不能放String
package generic; import java.util.ArrayList; public class TestGeneric { public static void main(String[] args) { ArrayList<Number> numbers = new ArrayList<>(); numbers.add(123);//int numbers.add(123f);//float numbers.add(123d);//double numbers.add("String"); } }
package generic;
   
import java.util.ArrayList;
   
public class TestGeneric {
   
    public static void main(String[] args) {
        ArrayList<Number> numbers = new ArrayList<>();
        numbers.add(123);//int
        numbers.add(123f);//float
        numbers.add(123d);//double
        
        numbers.add("String");
        
    }
      
}


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


问答区域    
2022-06-07 答案
大D




答案
ArrayList<Number> number =new ArrayList<>();
number.add(12);
number.add(13.14);
        System.out.println(number.toString());

							


7 个答案

木宇
答案时间:2024-07-10
打卡

实习英雄
答案时间:2023-12-21
import java.util.ArrayList; public class NumberCollection { public static void main(String[] args) { // 创建一个只能存放Number类型对象的ArrayList ArrayList<Number> numbers = new ArrayList<>(); // 添加整数(Integer)和浮点数(Double) numbers.add(5); // 自动装箱为Integer numbers.add(3.14); // 自动装箱为Double // 如果尝试添加字符串,下面这行将在编译时报错 // numbers.add("字符串"); // 编译错误 // 输出集合内容 for (Number num : numbers) { System.out.println(num); } } }

hhh1996
答案时间:2023-08-21
List<Number> list= new ArrayList<>(); list.add(11); list.add(11.1); //list.add("11");

LUO萝北
答案时间:2023-04-27
List<Number> list = new ArrayList<>();

314115926
答案时间:2023-03-13
cwhandlfz
答案时间:2023-02-02
ArrayList<Number> numbers= new ArrayList<>();

wanliu
答案时间:2023-01-23
List<Number> numbers= new ArrayList<>();



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





2022-05-13 为什么这么写不对,是我想复杂了吗
芬达味橘猫




如题
public class numClass <I,F> {
    private I ib;
    private F fb;

    public numClass(){
        try {
            if (!(ib instanceof Integer|fb instanceof Float))
                throw new Exception("请传入Integer和Float类型");
        }catch (Exception e){
            e.printStackTrace();
        }

    }
    public static void main(String[] args) {
        numClass<Integer,Float> test_num_float = new numClass<>();
    }
}

							


3 个答案

晚安嘛
答案时间:2024-03-27
参数加一个Object O,把要加的数据类型传到这里判断

wr123
答案时间:2023-11-15
import java.io.File; import java.util.*; public class Main { public static void main(String[] args) { List<Number> number= new ArrayList<>(); number.add(11); number.add(11.1); //list.add("11");//报错显示,string类型不符合 } }

多姆达
答案时间:2022-06-05
貌似是因为空参构造不行,把 I 和 F 加进去之后能跑了



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





2021-01-07 大佬 咱过来也只是学习的 请把F12的屏蔽解开 这个也只是前端的简单处理下 还是可以看到的 好的方案建议把视频地址做成动态的
2021-01-07 大佬要收费直接把视频做了点击再给出视频地址嘛 ,别直接做个隐藏一下就找到了 没意义
2020-07-10 答案


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

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

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

上传截图