泛型和泛型通配符

众所周知,java中可以使用泛型,在声明类的方法的时候可以不必指定类型,而是使用泛型代替,当作为泛型方法时,Java会根据你传入的类型,替换泛型为传入的类型,泛型类也差不多。

泛型方法:

public class Test {
    public static <T> T getprint(T s) {return s;}
 
    public static void main(String[] args) {
        System.out.println(getprint("abc"));
        System.out.println(getprint(123));
        ArrayList<String> list=new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        System.out.println(getprint(list));
    }
}

泛型类:

public class Study {
    public static void main(String[] args) {
        Test<String> test01=new Test<String>("abc");
        System.out.println(test01.getKey());
        //
        Test<Integer> test02=new Test<Integer>(123);
        System.out.println(test02.getKey());
        //
        Test<ArrayList<String>> test03=new Test<ArrayList<String>>(new ArrayList<>(Arrays.asList("aaa", "bbb")));
        System.out.println(test03.getKey());
    }
}
 
class Test<T> {
    private T key;
 
    public Test(T key) {this.key = key;}
 
    public T getKey() {return key;}
 
    public void setKey(T key) {this.key = key;}
}

泛型z作用范围:

当类上声明泛型T同时方法也声明泛型T,方法的泛型和类泛型是隔离的即使是相同T。

public class Stdudy<T> {
    /*
     * 方法前无<T>,泛型类中的方法,其中的T类型与泛型类的T类型一致。
     */
    public T gogo(T t) {return t;}
 
    /*
     * 方法前有<T>,泛型方法,其中的T类型是独立的,不受泛型类的T类型约束
     */
    public <T> T go(T t) {
        return t;
    }
 
    public static void main(String[] args) {
        String s = "abc";
        new Stdudy().go(s);
    }
}

此外还有一种?符号,这里他不是三目运算符

其中?是什么呢,?是泛型通配符,而不是泛型

此外泛型还可以指定范围:

extends:表示类型上界。例:A extends B,表示类型必须是B或B的子类

super:表示类型下界。例:A super B,表示类型必须是B或B的父类

<? extends Number>表示初始化值上限值是小于等于Number,下限值是无穷小的子类 <? super Integer>表示初始化值上限值是小于等于Object,下限值是大于等于Integer <?>表示无限大

List list=new ArrayList<>();

这个list在插入值时,这个例子中插入值必须小于等于Number,即必须是Number或者他的子类。

但是List<?> list=new ArrayList();无法添加

当你声明 List<?> 时,你声明了一个可以持有任何类型对象的列表。但是,由于类型擦除,你不能向这样的列表中添加任何对象,因为编译器无法确定添加的对象类型是否安全。你可以从中读取对象,但必须进行类型检查或转换。

image-20240904213012518

“?”可以独立用于参数范围的限定:

public class Test {
    public static void go(List<? extends Number> dest){
        System.out.println(dest);
    }
    public static void main(String[] args) {
        go(new ArrayList<>(Arrays.asList(111,222)));
    }
}

“?”通配符也可以和泛型配合:

    public static <T> void go(List<? extends T> dest){
        System.out.println(dest);
    }

也可以和泛型配合:

    public static <T> void go(List<? extends T> dest){
        System.out.println(dest);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值