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; } }