java基础 泛型

1.泛型集合中的元素是存在继承关系的

public class Main {
    public static void main(String[] args) {
        List<Shape> list=new ArrayList<Shape>();
        list.add(new Circle());
        list.add(new Rectangle());
    }
}

class Canva {
    public void drawAll(List<? extends Shape> list) {
        for (Shape s : list) {
            s.draw(this);
        }
    }
}

abstract class Shape {
    public abstract void draw(Canva c);
}

class Circle extends Shape {
    @Override
    public void draw(Canva c) {
        System.out.println("在画布" + c + "画圆");
    }
}

class Rectangle extends Shape {
    @Override
    public void draw(Canva c) {
        System.out.println("在画布" + c + "画矩形");
    }
}

 

2.泛型类中的泛型不能设置到静态成员中

泛型实际上就是将运行时期出现的错误,放到编译时期,在运行时实际会擦除泛型类型,静态成员属性类成员,所有对象共享,如果运行泛型类型那么也就是在实例中静态成员的类型可以不一样,这样违背了java静态成员的语法

class Apple<T>{
    public static T color; //泛型类型不能应用到静态成员上

    private T info;

    public Apple() {
    }

    public Apple(T info) {
        this.info = info;
    }

    public T getInfo() {
        return info;
    }

    public void setInfo(T info) {
        this.info = info;
    }
}

 

3.在编写泛型类子类时,继承的泛型类必须是原生类或泛型类型明确的泛型类

原因:如果创建c类对象,实际jvm也会为我们创建父类Apple类的对象,但是Apple类中成员类型缺是未知的

class A extends Apple<String>{

}

class B extends Apple{

}

class C extends Apple<T>{  //错误

}

 

4.泛型类不是真正的类
泛型类不是真正的类,只是编译时期的一种类型表示方式,在运行时期会擦除泛型类型变成原生类,比如:List<String>不存在这种类型的类,也不会生成对应的class文件,运行时期原生类时List,产生的class文件是List.class ,所以对于List<String>.class或instanceof的使用都是错误的

public class Main {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        System.out.println(List<String>.class); //错误
        
        if(list instanceof List<Object>){ //错误
            
        }
    }
}

 

5.泛型类中使用通配符时,表示类型是未知的,那么可以接受的泛型类实例可以是任意的

public class Main {

    public void test(List<Object> list){
        for (int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
    }

    public void test2(List<?> list){

        Object o=list.get(0); //list中的元素类型是未知的,取出来的元素类型使用Object来接
        list.add(new Object()); // list中的元素类型是未知的,所以无法往list中插入元素

        for (int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
    }

    public static void main(String[] args) {
        Main m=new Main();
        m.test(new ArrayList<String>()); //test需要的是List<Object>类型
        m.test2(new ArrayList<String>());
    }
}

 

总结:

1.可以泛型类理解为在编译时期泛型类时存在的逻辑类,如:在编译时期List<String>、List<Object>是两个类,在运行时期他们都将变成List类

2.要保证泛型类的语法正确,必须是编译器泛型类语法正确和运行期语法正确

  

  

  

posted @ 2017-11-07 15:32  tomcuper  阅读(157)  评论(0编辑  收藏  举报