在严格的泛型代码里,带泛型声明的类总应该带着泛型参数。但是为了和古老的java代码保持一致,也就是说为了向下兼容,也允许在使用带泛型声明的类时不指定实际的类型参数。如果没有为这个泛型类指定实际的参数类型,则该类型参数就被称为rawtype,也就是原始类型。比如说我们声明一个list的时候如果没有传入实际的泛型参数,我们可以抑制警告,这个时候这个警告抑制的就是rawtype,默认是声明该类型参数时指定的第一个上线类型。
- 什么是泛型的擦除?
public class Test<S> { S name; public S getName() { return name; } public void setName(S name) { this.name = name; } public static void main(String[] args) throws Exception { Test<Integer> test1 = new Test<>(); test1.setName(1); Test test2 = test1; //泛型的擦除,编译过程中丢失了具体的参数类型 Integer name2 = (Integer) test2.getName(); //运行时候对象的类型没变,擦除只是发生在编译阶段 System.out.println(test2.getName().getClass()); } }
- 什么是泛型的转换?
public class Test<S> { S name; public S getName() { return name; } public void setName(S name) { this.name = name; } public static void main(String[] args) throws Exception { List<Integer> list = new ArrayList<>(2); list.add(1); list.add(2); List list1 = list; List<String> list2 = list1; System.out.println((String)list2.get(0)); } }
风流子弟曾少年,多少老死江湖前。。。