正如前文所述,由于Java编译器可以从OrderedPair <String,Integer>声明中推断 K 和 V 类型,因此可以使用以下缩写:
OrderedPair <String,Integer> p1 = new OrderedPair <>(“Even”,8); OrderedPair <String,String> p2 = new OrderedPair <>(“hello”,“world”); 参数化类型您也可以用参数化类型(即List )替换类型参数(即 K 或 V)。例如,使用OrderedPair <K,V>示例:
OrderedPair <String,Box <Integer>> p = new OrderedPair <>(“primes”,new Box <Integer>(...)); 原始类型原始类型是没有任何类型参数的泛型类或接口的名称。
例如,给定一个 Box 泛型类:
public class Box<T> { public void set(T t) { /* ... */ } // ... }要创建参数化类型,为形式类型参数 T 提供实际类型参数:
Box<Integer> intBox = new Box<>();如果省略实际类型参数,则会创建一个Box<T>的原始类型:
Box rawBox = new Box();因此,Box 是泛型Box<T>的原始类型。但是,非泛型类或接口类型不是原始类型。
在 JDK5.0 之前很多 API 类(如 Collections 类)不是通用的,为了向后兼容,允许将参数化类型分配给其原始类型:
Box<String> stringBox = new Box<>(); Box rawBox = stringBox; // OK但是,将原始类型分配给参数化类型,编译器会发出一个警告:
Box rawBox = new Box(); // rawBox 是 Box<T> 的原始类型 Box<Integer> intBox = rawBox; // warning: unchecked conversion如果使用原始类型来调用相应泛型类型中定义的泛型方法,则还会收到警告:
Box<String> stringBox = new Box<>(); Box rawBox = stringBox; rawBox.set(8); // warning: unchecked invocation to set(T)该警告显示原始类型绕过了泛型类型检查,将不安全代码的捕获推迟到运行时。因此,你应该避免使用原始类型。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx