Java7新增的“菱形”语法,允许调用构造器时在构造器后使用<>来代表泛型信息:
i. 和使用普通泛型方法一样没区别,一种是显式指定泛型参数,另一种是隐式推断,如果是显式指定则以显式指定的类型参数为准,如果传入的参数的类型和指定的类型实参不符,将会编译报错;
!典型示例:A a = new <String>A("lala"); // 菱形实参还是写在方法名之前
ii. 这里唯一需要特殊注明的就是,如果构造器是泛型构造器,同时该类也是一个泛型类的情况下应该如何使用泛型构造器:
a. 因为泛型构造器可以显式指定自己的类型参数(需要用到菱形,放在构造器之前),而泛型类自己的类型实参也需要指定(菱形放在构造器之后),这就同时出现了两个菱形了,这就会有一些小问题,具体用法再这里总结一下;
b. 这里使用的类是这样定义的:public A<T> { public <E> A(E e) { ... } }
b. 全指定,例如:A<String> a = new <Integer>A<String>(15); // 所有类型实参全部显式指定,Integer代表E,String代表T
c. 全隐藏,例如:A<String> a = new A<>(15); // 可以隐式推断出Integer是E,String是T
d. 半隐藏,例如:A<String> a = new A<String>(15); // 还是可以推断出E是Integer,而String是T
e. 上面的叫做半隐藏T,但是不能半隐藏E,例如:A<String> a = new <Integer>A<>(15); // 虽然也可以正确推断,但是这种语法不允许!!会直接编译报错!
!!因此这里麻烦的是需要稍微记忆一下,不能半隐藏E
!!平时使用的时候就使用其中一种,推荐是全隐藏,越简洁越好,就是用一种就不会增加记忆负担;
上面一段泛型构造器篇幅,参考网址:
设定通配符下限:
现在要实现一个工具方法:将src集合里的元素复制到dest集合里的功能,分析:因为dest集合可以保存src集合里的所有元素,所以dest集合元素的类型是src集合元素类
型的父类,代码如下:
现在又要让该方法具有返回值,返回最后一个被复制的元素,代码如下:
表面上看起来方法实现了返回值的功能,但是若用下面的程序验证,则会报错:
ln类型是List<Number>,li类型是List<Integer>,与copy()方法比较后,确认T类型形参是Number,返回值类型也是Number类型,所以Integer last不能赋值为Number类型
解决方法:可以这样理解两个集合参数之间的依赖关系:不管src集合元素的类型是什么,只要dest集合元素的类型与前者相同或是前者的父类即可。为了表达这种约束关系