1.泛型构造器

java中也支持泛型构造器。在泛型类中允许使用菱形语法,但不允许在显示声明构造器泛型类型的情况下使用菱形语法。

class Foo <E>{
    public <T> Foo(T t) {
        System.out.println(t);
    }
}

public class GeneratorConstructor {
    public static void main(String[] args) {
        new Foo("人不轻狂枉少年");
        new <Integer> Foo(20);
        //使用菱形语法,E传入实参为String类型,E泛型构造器中T参数传入实参为Integer
        Foo <String> foo=new Foo<>(5);
        //E传入实参为String类型,显示声明构造器中的方法T传入实参为Integer
        Foo <String> foo2=new <Integer> Foo <String>(5); 
        //编译错误
        //Explicit type arguments cannot be used with '<>' in an allocation expression
        //Foo <String> foo3=new <Integer> Foo <>(5);
    }
}

2.设置通配符下限

考虑场景:在copy方法中吧集合src中的元素复制到dest集合中,同时要求返回最后一个添加的元素。如果我们采用设置通配符上限的方法,那么返回最后一个添加的元素时,将返回一个丢失实际类型的参数。

public class MyUtils_1 {
    public static <T> T copy(Collection<T> dest,
            Collection<? extends T> src){
        T last = null;
        for(T ele : src){
            last = ele;
            dest.add(ele);
        }
        //返回的类型为T,但last元素实际上可能是T的子类
        return last;
    }
}

Java中设计了类型通配符下限解决这一需求。

public class MyUtils {
    //下面dest集合元素的类型必须与src元素的类型相同,或是其父类
    public static <T> T copy(Collection<? super T> dest,
            Collection<T> src){
        T last = null;
        for(T ele : src){
            last = ele;
            dest.add(ele);
        }
        return last;
    }
}