泛型[6]声明变量类型时使用泛型通配符

来源:互联网 发布:档案管理系统软件 编辑:程序博客网 时间:2024/06/06 01:23

 

可以在声明变量类型的时候使用?通配符。

并且还可以结合extendssuper使用。(对比“定义&使用”小节,只出现了extends

 

注意是声明的时候可以使用,比如说

1、变量的类型(局部变量&成员变量)

List<?extends Fruit>list1 =new ArrayList<Fruit>();

2、方法形参的类型

publicstaticvoid test(List<?extends Fruit>list)

3、定义泛型 添加extends限制时extends的类型(这个后面还会具体讲)

publicstatic <TextendsComparable<?super T>>void sort(List<T>list){}

 

而如下写法是不正确的。(在定义泛型方法时泛型元素使用了通配符)


 

使用?表示可以使用的时候可以传递任意类型(Object及其子类)。对这个类型的操作都会按照Object来对待。(类似于泛型擦除,但不等同)

 Java Code 

 

import java.util.ArrayList;

public class Test {
    
public static void main(String[] args) {

        
// 符合类型都可以使用
        ArrayList<?> list = new ArrayList<Integer>();
        list = 
new ArrayList<Object>();

        
// 这个地方只能放入null,因为?可能是任意类型,而只有null可以看作任意类型
        // 结合后面extends&super理解
        list.add(null);

        
// 按照Object类型来使用
        Object object = list.get(0);

        test(list);
    }

    
public static void test(ArrayList<?> list) {

    }
}

 

还可以将?结合extendssuper使用。注意将其用于声明形式参数类型时,该对象所能支持的方法跟普通的有较大差异。

以如下类型继承关系为例

 

 Java Code 

 

import java.util.ArrayList;
import java.util.List;

public class ExtendsTest {
    
    List<? 
extends Fruit> list2;

    
public static void main(String[] args) {

        
//1、传递的时候可以传递子类
        List<Fruit> list1 = new ArrayList<Fruit>();
        test(list1);

        List<Apple> list2 = 
new ArrayList<Apple>();
        test(list2);
        
        List<? 
extends Apple> list3 = new ArrayList<FujiApple>();
        test(list3);
        
        List<? 
extends Fruit> list4 = new ArrayList<Fruit>();
        test(list4);

        
// List<?> list5=new ArrayList<Fruit>();
        // List<? extends Object> list5=new ArrayList<Fruit>();
        // test(list5);

    }

    
public static void test(List<? extends Fruit> list) {
        
        
//2 这个地方只能添加null,因为如果传递进来的是ArrayList<Apple>,就不能add Fruit, 如果传递进来的是ArrayList<FujiApple>, 则不能add Apple
        list.add(null);
        
// list.add(new Fruit());
        // list.add(new Apple());

        
//3、取出来是Fruit类型
        for (Fruit fruit : list) {
            fruit.toString();
        }
    }

}

 

 Java Code 

 

import java.util.ArrayList;
import java.util.List;

public class SuperTest {

    
public static void main(String[] args) {

        
//1、传递的时候可以传递父类
        List<Apple> list1 = new ArrayList<Apple>();
        test(list1);

        List<Fruit> list2 = 
new ArrayList<Fruit>();
        test(list2);

        List<? 
super Apple> list3 = new ArrayList<Apple>();
        test(list3);

        List<? 
super Fruit> list4 = new ArrayList<Object>();
        test(list4);

//      List<? super FujiApple> list6 = new ArrayList<FujiApple>();
//       test(list6);
//      List<?> list7 = new ArrayList<Apple>();
//       test(list7);
    }

    
public static void test(List<? super Apple> list) {

        
//2、这个地方可以添加Apple的子类,这样传递进来的时候可以向上转换
        list.add(new Apple());
        list.add(
new FujiApple());
//      list.add(new Fruit());//

        
//3、由于只要求是Apple的父类,那么里面可能是任何类型,所以取出来是Object
        for (Object object : list) {

        }

    }

}

 

 

 

0 0