泛型

泛型概述

泛型:是JDK5中引入的类型,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型。它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数

参数化类型的理解:将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型,这种参数类可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口。

泛型定义格式:

1.<类型>:指定一种类型的格式。这里的类型可以看成是形参

2.<类型1,类型2…>:指定多种类型的格式,多种类型之间用逗号隔开。这里的类型可以看成形参

将来具体调用时候给定的类型可以看成是实参,并且实参的类型只能是引用数据类型

泛型的好处:把运行时期的问题提前到了编译期间;避免了强制类型转换

泛型类定义格式

格式:修饰符 class 类名<类型>{}

范例:public class Generic{} 此处T可以写为任意标识,常见的如T、E、K、V等形式的参数用于表示泛型

public class GenericDemo{
    
    public static void main(String[] args){
        
        Student s = new Student();
        
        s.setName("林青霞");
        
        Teacher t = new Teacher();
        
        t.setAge (30);  //此处若是t.setAge("30");则报错,因为必须是Integer类型。也就是实参类型固定了。
        
        System.out.println(t.getAge());
        
       
    }
}

public class Teacher{
    
    private Integer age ;
    
    public Integer getAge(){
        return age;
    }
    
    public void setAge(Integer age){
        this.age=age;
    }
}

public class Student {
    
    private String name;
    
    public String getName(){
        return name;
    }
    
    public void setName(String name){
        this.name=name;
    }
}

以上程序可以直接用泛型类替换

public class Generic <T> {
    private T a;
    public T getA(){
        return a;
    }
    public void setA(T a){
        this.a=a;
    }
}

public class aa{
    
    public static void main(String[] args){
        
    	Generic<String> g1= new Generic<String>();
        g1.setA("林青霞");
        System.out.println(g1.getA());
        
        Generic<Integer> g2 = new Generic<Integer>();
        g2.setA(30);
        System.out.println(g2.getA());
    }
}
泛型方法

定义格式:修饰符 <类型> 返回值类型方法名(类型 变量名){}

范例:public void show(T a){}

public class GenericDemo{
    
    public static void main(String[] args){
        
        Generic g = new Generic();
        g.show("林青霞");
        g.show(30);
        g.show(true);
        g.show(12.22); // 报错,因为形参中没有指定此类型数据.此处没加一种类型,Generic类中就得加一个show方法
    }
}

public class Generic {
    
    public void show(String s) {
        System.out.println(s);
    }
    
    public void show(Integer i) {
        System.out.println(i);
    }
    
    public void show(Boolean b) {
        System.out.println(b);
    }
    
}

泛型方法改进

public class Generic<T>{
    public <T> void show(T a){
        System.out.println(a);
    }
}

public class GenericDemo{
    
     public static void main(String[] args){
         Generic g = new Generic();
         g.show("林青霞");
         g.show(30);
         g.show(true);
         g.show(12.22);
     }
}
泛型接口

定义格式:修饰符 interface 接口名 <类型>{}

范例:public interface Generic{}

public class GenericDemo{
    
    public static void main(String[] args){
        
        Generic<String> g1 = new GenericImpl<String>();
        g1.show("林青霞");
        
        Generic<Integer> g2 = new GenericImpl<Integer>();
        g2.show(30);
    }
}

public interface Generic<T>{
    
    void show(T a);
}

public class GenericImpl <T> implements Generic <T>{
    
    public void show(T a){
        System.out.println(a);
    }
}
类型通配符

为了表示各种泛型List的父类,可以使用类型通配符

  • 类型通配符:<?>
  • List<?>:表示元素类型未知的List,它的元素可以匹配任何类型
  • 这种带通配符的List仅表示它是各种泛型List的父类,并不能把元素添加到其中

如果我们不希望List<?>是任何泛型List的父类,只希望它代表某一类泛型List的父类,可以使用类型通配符的上限

  • 类型通配符上限:<?extends 类型>
  • List<?extends Number>:它表示的类型是Number或者其子类型

除了可以指定类型通配符的上限,也可以指定类型通配符的下限

  • 类型通配符下限:<?super类型>
  • List<? super Number>:它表示的类型是Number或者其父类型
import java.util.ArrayList;
import java.util.List;

public class GenericDemo{
    
    public static void main(String[] args){
        //类型通配符:<?>
        List<?> list1 = new ArrayList<Object>();
        List<?> list2 = new ArrayList<Number>();
        List<?> list3 = new ArrayList<Integer>();
        
        //类型通配符上限:<? extends 类型>
        List <?extends Number> list5 = new ArrayList<Number>();
        List <?extends Number> list6 = new ArrayList<Integer>();
        
        //类型通配符下限:<? super 类型>
        List <? super Number> list7 = new ArrayList<Object>();
        List <? super Number> list8 = new ArrayList<Number>();
       // List <? super Number> list9 = new ArrayList<Integer>();   报错
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值