Java学习笔记(十四)

ArrayList:

ArrayList 类有一个类型参数用来指示元素的类型:
ArrayList<String> files = new ArrayList<String>():

泛型类可以有多个类型变量。例如, 可以定义 Pair 类,其中第一个域和第二个域使用不同的类型:
public class Pair<T, U> { . . . }

类型变量使用大写形式,且比较短, 这是很常见的。在 Java 库中, 使用变量 E 表示集合的元素类型, K 和 V 分别表示表的关键字与值的类型。T ( 需要时还可以用临近的字母 U 和 S) 表示“ 任意类型”。

类型变量放在修饰符的后面,返回类型的前面

怎么才能确信 T 所属的类有 compareTo 方法呢?解决这个问题的方案是将 T 限制为实现了 Comparable 接口(只含一个方法 compareTo 的标准接口)的类。可以通过对类型变量 T 设置限定(bound) 实现这一点:

public static <T  extends Comparable> T min( T[ ] a)...

一个类型变量或通配符可以有多个限定, 例如:
T extends Comparable & Serializable     限定类型用“ &” 分隔,而逗号用来分隔类型变量。
如果用一个类作为限定,它必须是限定列表中的第一个。

原始类型用第一个限定的类型变量来替换, 如果没有给定限定就用 Object 替换。

为了提高效率,应该将标签(tagging) 接口(即没有方法的接口)放在边界列表的末尾。

需要记住有关 Java 泛型转换的事实:
•虚拟机中没有泛型,只有普通的类和方法。
•所有的类型参数都用它们的限定类型替换。
•桥方法被合成来保持多态。
•为保持类型安全性,必要时插人强制类型转换。

如果需要收集参数化类型对象, 只有一种安全而有效的方法:使用 ArrayList:ArrayList<Pair<String>>。

可以使用 @SafeVarargs 标注来消除创建泛型数组的有关限制

不能构造泛型数组。

不能在静态域或方法中引用类型变量。

既不能抛出也不能捕获泛型类对象。不过, 在异常规范中使用类型变量是允许的。

public static <T extends Throwable〉void doWork(T t) throws T // OK
{
try
{
do work
}
catch (Throwable real Cause)
   {
   t.initCause(real Cause);
   throw t;
   }
}

Java 异常处理的一个基本原则是, 必须为所有受查异常提供一个处理器。不过可以利用泛型消除这个限制。
关键在于以下方法:
@SuppressWamings("unchecked")
public static <T extends Throwable〉void throwAs(Throwable e) throws T
{
throw  (T) e;
}

通过使用泛型类、 擦除和 @SuppressWamings 注解, 就能消除 Java 类型系统的部分基本限制。

泛型规范说明还提到另外一个原则:“ 要想支持擦除的转换, 就需要强行限制一个类或类型变量不能同时成为两个接口类型的子类,而这两个接口是同一接口的不同参数化。”

无论 S 与 T 有什么联系 ,通常, Pair<S> 与 Pair<T>没有有什么联系。

通配符:

public static void printBuddies(Pair<? extends Eiployee> p)
类型 Pair<Manager> 是 Pair<? extends Employee> 的子类型

直观地讲,带有超类型限定的通配符可以向泛型对象写人,带有子类型限定的通配符可以从泛型对象读取。

猜你喜欢

转载自blog.csdn.net/qq_38022739/article/details/89134469