jdk泛型

1. 泛型不是协变的

List<Object> 不是 List<String> 的父类型。

 

2. 问号 类型通配符。

List<?> 是任何泛型 List 的父类型,所以您可以将 List<Object>List<Integer>List<List<List<String>>> 代入方法参数是List<?>地方

 

但是把List<Integer>类型的变量赋给List<?>后不是所有的操作都支持。因为list<?>并不知道类型信息,所有与类型相关的方法不能工作,比如add(new Integer(1));然而不依赖与类型的方法仍然工作,比如clear()

 

 

3.泛型参数用在类上时,约束的是类中的所有用到它的方法;泛型参数用到方法级别时约束到的是方法级别的。

 

用以下方式申明

public <T> T ifThenElse(boolean b, T first, T second) {
  return b ? first : second;
}

 

调用时通过类型推理,用以下方式调用

String s = ifThenElse(b, "a", "b");

Integer i = ifThenElse(b, new Integer(1), new Integer(2));

 

4. 受限制的类型参数

 

只允许用Number或者Number子类的类型参数。

public class Matrix<V extends Number> { ... }

 

注意不用受限制的类型参数时,默认是从Object的继承的。即不用extends 语句时取出的都是Object

 

5. 上限通配符和下限通配符

 

上限通配符

interface Collection<V> {
  boolean addAll(Collection<? extends V>);
}

该定义组合了通配符类型参数和有限制类型参数,允许您将 Collection<Integer> 的内容添加到 Collection<Number>。允许加入V或者V的子类

 

下限通配符

 Collection<? super Foo>。只有通配符可以具有下限。

可以加入V或者V的父类

 

下例中copyTo() 方法将 Bunch 的所有值复制到指定的集合中。不是指定它必须是一个 Collection<V>,而可以指定它是一个 Collection<? super V>,这意味着 copyTo() 可以将 Bunch<String> 的内容复制到 Collection<Object>Collection<String>,而不只是可以复制到 Collection<String>

class Bunch<V> {
  public void add(V value) { ... }
  public void copyTo(Collection<? super V>) { ... }
  ...
}

 

 

 

6. 除了jdk中collection api加入泛型支持,其他接口,类的泛型声明实现并不是很好理解

 

接口

public interface Comparable<T> { 
  public boolean compareTo(T other);
} 

 

实现

public class String implements Comparable<String> { ... }

 

在下例中,您定义了一个泛型方法,在类型 T 上泛型化,您约束该类型扩展(实现) Comparable<T>

public static <T extends Comparable<T>> T max(T t1, T t2) {
  if (t1.compareTo(t2) > 0)
    return t1;
  else 
    return t2;
}

 

调用

String s = max("moo", "bark");

 

 

你可能感兴趣的:(jdk)