Java泛型(龟速更新中)
所有笔记内容基于教材《Java语言程序设计与数据结构(进阶篇)》
19.2
- <T>表示形式泛型类型,虽然没有明确限制,但一般用大写E或T表示。
- 实际使用时,需要泛型实例化,用具体类型替换T。
- 泛型的优点是可以在编译时检测出错误,一般是类型不匹配的错误。
- 穿插一个之前接口的内容,接口可以用作声明类型,但要求引用对象的类必须实现该接口。例子:
1 Comparable<Date> c = new Date();
- 并不是所有地方都需要用到泛型。如ArrayList类中的contains方法,参数是Object。那为什么不用泛型E呢?因为这里并不需要我们严格运行出一个结果,换句话说,用一个非E的obj参数也能顺利运行完该方法,只不过结果为false罢了。这样做是为了适应更多不同的参数而不局限于E。
- 泛型类型必须是引用类型。对于基本数据类型,一般用其包装类即可。会有自动装箱和拆箱机制。
19.3
-
定义泛型类/接口。直接在类名后面加<E>即可。如果有多个参数,需逗号分隔,如:<E1, E2, E3>等。
- 类里面的实例方法也可以用到泛型,即返回类型可以是E,参数类型可以是E。
- 类里面的实例变量可以用泛型,但是初始化的时候不能用new E()这样的方法,只能在构造方法中获得一个引用。一般如果E是不可变类则问题不大,其他的话可能存在浅复制会出现的问题。
//Test.java public class Test<E>{ private E a; public Test(E a) { this.a = a; } public void show() { System.out.println(a); } }
//Main.java public class Main { public static void main(String[] args) { Test<Integer> t = new Test<Integer>(6); t.show(); //6 } }
- 泛型类的构造方法和普通类的一样,应该定义为:
public GenericStack()
没有<E>
- 创建泛型类实例,如:new GenericStack<String>()。注意泛型类如果有多个参数,则需全部实例化,不能缺省。
- 泛型类可被继承;泛型接口可被实现。继承者/实现者本身也可以是一个泛型类。