Java泛型学习笔记 - 有界类型参数
Posted ZhenyuGo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java泛型学习笔记 - 有界类型参数相关的知识,希望对你有一定的参考价值。
1. 当我们希望对泛型的类型参数的类型进行限制的时候(好拗口), 我们就应该使用有界类型参数(Bounded Type Parameters). 有界类型参数使用extends关键字后面接上边界类型来表示, 注意: 这里虽然用的是extends关键字, 却不仅限于继承了父类E的子类, 也可以代指显现了接口E的类. 仍以Box类为例:
1 public class Box<T> { 2 3 private T obj; 4 5 public Box() {} 6 7 public T getObj() { 8 return obj; 9 } 10 11 public void setObj(T obj) { 12 this.obj = obj; 13 } 14 15 public Box(T obj) { 16 super(); 17 this.obj = obj; 18 } 19 20 public <Q extends Number> void inspect(Q q) { 21 System.out.println(obj.getClass().getName()); 22 System.out.println(q.getClass().getName()); 23 } 24 }
我加入了public <Q extends Number> void inspect(Q q){...}方法, 该方法的泛型只能是Number的子类.
1 Box<String> b = new Box<>(); 2 b.setObj("Hello"); 3 b.inspect(12); 4 b.inspect(1.5); 5 // b.inspect(true); // 编译出错
2. 界类型参数除了规定泛型的范围之外, 还允许我们调用边界类型所拥有的方法(因为所有类型参数都是边界类型或边界类型的子类), 如:
1 public class NatureNumber<T extends Integer> { 2 3 private T t; 4 5 public Box() {} 6 7 public NatureNumber(T t) { 8 this.t = t; 9 } 10 11 public boolean isEven() { 12 return t.intValue() % 2 == 0; 13 } 14 15 // ... 16 }
3. 多边界:
上面的例子展示的是单边界的泛型, 我们还可以使用多边界泛型:
<T extends A & B & C>
但是多边界使用时其实只能继承一个父类, 并且要将他写在第一个位置上. 其他的都是其实现的接口, 如:
1 class A { /* ... */ } 2 interface B { /* ... */ } 3 interface C { /* ... */ } 4 class D <T extends A & B & C> { /* ... */ }
如果A不在第一个位置上就会编译出错.
以上是关于Java泛型学习笔记 - 有界类型参数的主要内容,如果未能解决你的问题,请参考以下文章