泛型的使用及注意点

xiaoxiao2021-02-28  94

早期jdk1.5之前没有引入泛型的苦恼

package src.com.gcx.demo; /** * Object 可以接受任意类型,因为发生多态 * @author Administrator * */ public class Student { private Object javase; private Object oracle; public Student() { } public Student(Object javase, Object oracle) { super(); this.javase = javase; this.oracle = oracle; } public Object getJavase() { return javase; } public void setJavase(Object javase) { this.javase = javase; } public Object getOracle() { return oracle; } public void setOracle(Object oracle) { this.oracle = oracle; } } package src.com.gcx.demo; /** 早期没有泛型很繁琐,容易出错 * 获取值: * 1、强制类型转换 * 2、手动类型检查:避免转换错误 java.lang.ClassCastException: * @author Administrator * */ public class Demo2 { /** * @param args */ public static void main(String[] args) { Object obj = 80; //int score =(int)obj; //jdk1.5以后 Object -->integer -->自动拆箱 int score=(Integer)obj; System.out.println(score); //存入整数 int -->Integer -->Object Student stu = new Student("80","90"); //()stu.getJavase(); int javaseScore =(Integer)stu.getJavase(); String oracleScore =null ; if(stu.getOracle() instanceof String){ oracleScore =(String)stu.getOracle(); } System.out.println("分数为:"+javaseScore+","+oracleScore); } }

现在开始深入学习Java的泛型了,以前一直只是在集合中简单的使用泛型,根本就不明白泛型的原理和作用。泛型在java中,是一个十分重要的特性,所以要好好的研究下。 泛型的基本概念泛型的定义:泛型==参数化类型。 泛型是JDK 1.5的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数,在用到的时候在指定具体的类型。

泛型使用

package src.com.gcx.demo; import java.util.ArrayList; import java.util.List; /** * 在接口中只能用在抽象方法上 * 不能用在全局常量上 * 泛型不能用在静态属性上 * 必须是引用类型 * @author Administrator * */ public interface Demo4<t> { public static final /*<t> */int MAX_VALUE=120; public abstract <t> void sayHello(); } class Abs<t>{ public static /*T*/int instance; public static void main(String[] args) { List<integer> list=new ArrayList<integer>(); //List<int> list2=new ArrayList<int>(); } } </int></int></integer></integer></t></t></t></t>

泛型继承

package src.com.gcx.demo; /**泛型继承 * 保留父类泛型--->子类为泛型 * 不保留父类泛型---->子类按需实现 * 泛型子类为富二代 和顺序无关 * @author Administrator * * @param <t1> * @param <t2> */ public abstract class Demo3<t1 t2=""> { } //全部保留 class A<t1 t2="" a="" b=""> extends Demo3<t1 t2="">{ } //部分保留 class B<t2 a="" b=""> extends Demo3<integer t2="">{ } //具体类型 class C<a target=_blank b=""> extends Demo3<integer string="">{ } //没有类型-->泛型擦除 默认是object class D<a target=_blank b=""> extends Demo3{ } </a></integer></a></integer></t2></t1></t1></t1></t2></t1>

通配符使用及注意点

package com.gcx.demo; /** * 通配符,类型不确定,用于生命变量|形参上 * 不能用在 创建对象,创建泛型接口,泛型类,泛型类上 * */ import java.util.ArrayList; import java.util.List; public class Demo1 { public static void main(String[] args) { //声明 List<?> list=new ArrayList<integer>(); list=new ArrayList<object>(); list=new ArrayList<string>(); list=new ArrayList<double>(); test(list); //编译错误 //list=new ArrayList<?>(); } public static <t> void test(List<?> list){ } //不能用在泛型方法上 /*public static <?> void test2(List<?> list){ }*/ class Test<t>{ } //不能用在创建泛型类上 /*class Test2<?>{ }*/ } </t></t></double></string></object></integer>

泛型上限

package com.gcx.demo; public class Fruit { } class Apple extends Fruit{ } class Watermelon extends Fruit{ } class FujiApple extends Apple{ }

package com.gcx.demo; import java.util.ArrayList; import java.util.List; /** * 上限用extends 不能超过这个范围 (<=) * 一般用于限制操作 * 不能用在添加数据上面,一般都是读取操作 * @author Administrator * */ public class Demo2 { public static void main(String[] args) { Test<fruit> t1=new Test<fruit>(); Test<apple> t2=new Test<apple>(); Test<watermelon> t3=new Test<watermelon>(); List<? extends Fruit> list1=new ArrayList<fruit>(); test(list1); List<fruit> list2=new ArrayList<fruit>(); test(list2); List<apple> list3=new ArrayList<apple>(); test(list3); List<? extends Apple> list4=new ArrayList<fujiapple>(); test(list4); //为什么?不行 ? 等同于 ? extends Object 所以死掉了 /*List<?> list5=new ArrayList<fruit>(); test(list5);*/ List<fujiapple> app=new ArrayList<fujiapple>(); test(app); } public static void test(List<? extends Fruit> list){ //因为传过来的是FujiApple是Apple子类,所以不能添加上去 //list.add(new Apple()); //如果FujiApple下面还有子类,所以也不能添加 //list.add(new FujiApple()); //list.add(new Watermelon()); //list.add(new Fruit()); list.add(null); } static class Test<t extends="" fruit="">{ } } </t></fujiapple></fujiapple></fruit></fujiapple></apple></apple></fruit></fruit></fruit></watermelon></watermelon></apple></apple></fruit></fruit>

package com.gcx.demo; import java.util.ArrayList; import java.util.List; /** * super 泛型的下限 ( >= ) * 泛型没有多态 * */ public class Demo3 { public static void main(String[] args) { List<apple> apple=new ArrayList<apple>(); test(apple); List<fruit> apple2=new ArrayList<fruit>(); test(apple2); List<object> apple3=new ArrayList</object><object>(); test(apple3); List<? super Apple> apple4=new ArrayList<apple>(); test(apple4); List<? super Fruit> apple5=new ArrayList<object>(); test(apple5); /*Fruit<string>[] arr=new Fruit<string>[10];*/ //jdk1.7泛型简化 List<fruit> list2=new ArrayList<>(); /*List<? super FujiApple> apple6=new ArrayList<object>(); test(apple6);*/ /*List<?> apple7=new ArrayList</object><object>(); test(apple7);*/ } public static void test(List<? super Apple> list){ //不能添加父类 list.add(new Apple()); list.add(new FujiApple()); //list.add(new Fruit()); } } </object></fruit></string></string></object></apple></object></fruit></fruit></apple></apple>

转载请注明原文地址: https://www.6miu.com/read-59037.html

最新回复(0)