canvas教程

【第九章.泛型(7)

字号+ 作者:H5之家 来源:H5之家 2017-08-16 15:00 我要评论( )

Java7新增的“菱形”语法,允许调用构造器时在构造器后使用来代表泛型信息: 1 class MyClassE{ 2public T MyClass(T t){ 3System.out.println("t 参数的值为:" + t); 4} 5 } 6 7 public class GenericDiamondTest

    Java7新增的“菱形”语法,允许调用构造器时在构造器后使用<>来代表泛型信息:

1 class MyClass<E>{ 2 public <T> MyClass(T t){ 3 System.out.println("t 参数的值为:" + t); 4 } 5 } 6 7 public class GenericDiamondTest{ 8 public static void main(String[] args){ 9 //MyClass类声明中的E形参是String类型 10 //泛型构造器中声明的T参数是Integer类型 11 MyClass<String> mc1 = new MyClass<>(5); 12 //显示指定泛型构造器中声明的T形参是Integer类型 13 MyClass<String> mc2 = new <Integer> MyClass<String>(5); 14 //MyClass类声明中的E形参是String类型 15 //若显示指定泛型构造器中声明的T形参是Integer类型 16 //此时就不能使用“菱形”语法,下面代码是错误的 17 MyClass<String> mc3 = new <Integer> MyClass<>(5); 18 } 19 } View Code

   

 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集合元素类

     型的父类,代码如下:

1 public static <T> void copy(Collection<T> dest, Collection<? extends T> src){ 2 for(T ele : src){ 3 dest.add(ele); 4 } 5 } View Code

    现在又要让该方法具有返回值,返回最后一个被复制的元素,代码如下:

1 public static <T> T copy(Collection<T> dest, Collection<? extends T> src){ 2 T last = null; 3 4 for(T ele : src){ 5 last = ele; 6 dest.add(ele); 7 } 8 9 return last; 10 } View Code

    表面上看起来方法实现了返回值的功能,但是若用下面的程序验证,则会报错:

1 List<Number> ln = new ArrayList<>(); 2 List<Integer> li = new ArrayList<>(); 3 //下面代码引起编译错误 4 Integer last = copy(ln, li); View Code

    ln类型是List<Number>,li类型是List<Integer>,与copy()方法比较后,确认T类型形参是Number,返回值类型也是Number类型,所以Integer last不能赋值为Number类型

    解决方法:可以这样理解两个集合参数之间的依赖关系:不管src集合元素的类型是什么,只要dest集合元素的类型与前者相同或是前者的父类即可。为了表达这种约束关系

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 使用jquery-qrcode生成二维码

    使用jquery-qrcode生成二维码

    2017-08-16 14:01

  • python学习笔记14--用Tkinter实现GUI编程

    python学习笔记14--用Tkinter实现GUI编程

    2017-08-15 17:00

  • Canvas名侦探柯南-canvas练习,canvas-canvas

    Canvas名侦探柯南-canvas练习,canvas-canvas

    2017-08-12 14:00

  • 读javascript高级程序设计04-canvas

    读javascript高级程序设计04-canvas

    2017-08-06 11:01

网友点评
5