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泛型学习笔记 - 有界类型参数的主要内容,如果未能解决你的问题,请参考以下文章

如何调用有界JAVA的泛型参数化方法?

java学习笔记9.22(泛型)

学习笔记Java基础知识——泛型与集合

java泛型

Java泛型学习笔记 - 泛型的介绍

Java重温学习笔记,关于泛型