jdk泛型
泛型不是协变的
1 | List<Object> 不是 List<String> 的父类型。 |
问号 类型通配符
List> 是任何泛型 List 的父类型,所以您可以将 List
泛型参数用在类上时,约束的是类中的所有用到它的方法;泛型参数用到方法级别时约束到的是方法级别的
用以下方式申明
1 | public <T> T ifThenElse(boolean b, T first, T second) { |
调用时通过类型推理,用以下方式调用
1 | String s = ifThenElse(b, "a", "b"); |
受限制的类型参数
只允许用Number或者Number子类的类型参数。
1 | public class Matrix<V extends Number> { ... } |
注意不用受限制的类型参数时,默认是从Object的继承的。即不用extends 语句时取出的都是Object
上限通配符和下限通配符
上限通配符
1 | interface Collection<V> { |
该定义组合了通配符类型参数和有限制类型参数,允许您将 Collection
下限通配符
1 | Collection<? super Foo> |
只有通配符可以具有下限。 可以加入V或者V的父类。下例中copyTo() 方法将 Bunch 的所有值复制到指定的集合中。不是指定它必须是一个 Collection
1 | class Bunch<V> { |
除了jdk中collection api加入泛型支持,其他接口,类的泛型声明实现并不是很好理解
接口
1 | public interface Comparable<T> { |
实现
1 | public class String implements Comparable<String> { ... } |
在下例中,您定义了一个泛型方法,在类型 T 上泛型化,您约束该类型扩展(实现) Comparable
1 | public static <T extends Comparable<T>> T max(T t1, T t2) { |
调用
1 | String s = max("moo", "bark"); |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 石头记!
评论