笔记——Java泛型

泛型

泛型是解决“数据类型与算法在编译是绑定”这一问题的有效方法之一。泛型最大的价值在于:在保证类型安全的前提下,把算法与数据类型解耦。

3.2泛型类

泛型类是指该类使用的参数类型作用于整个类,即在类的内部任何地方(不包括静态代码区域)都可把参数类型当做一个真实类型来使用。




public class Person<T>{
    private T t;
    public Person(T t){
        this.t = t;
    }
    public String toString(){
        return "参数的类型是:" + t.getClass().getCanonicalName();
    }
}

public class Teacher<V,S> extends Person{
    protected V v;
    private S s;
    public Teacher(Object t){
        super(t);
    }
    
    public void set(V v,S s){
        this.v = v;
        this.s = s;
    }
}

泛型方法

public class Factory{
    public<T> T generator(Class<T> t) throws Exception{
        return t.newInstance();
    }
}

泛型接口

public interface Factory<T>{
    public T create();
}

泛型方法使得该方法能够独立于类而发生变化。以下是一个基本的指导原则:无论何时,只要你能做到,你就应该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛型化,那么就应该只用泛型方法。另外,对于一个static的方法而言,无法访问泛型类的类型参数,所以,如果static方法需要使用泛型能力,就必须使其成为泛型方法。

Java泛型是使用擦除来实现的,这意味着当你在使用泛型时,任何具体的类型信息都被擦除了,你唯一知道的就说你在使用一个对象。因此List<String>和List<Integer>在运行时事实上是相同的类型。这两种形式都被擦除称他们的“原生”类型,即List。

必须查看代码确定是否“足够复杂”到必须使用泛型的程度。

擦出的代价是显著的。泛型不能用于显示的引用运行时类型的操作之中,例如转型、instanceof操作和new表达式。因为所有关于参数的类型信息都丢失了,无论何时,当你在编写泛型代码时,必须时刻提醒自己,你只是看起来好想拥有有关参数的类型信息而已。

——摘自《Think in Java》

原文地址:https://www.cnblogs.com/wxx23-IOU/p/14444419.html