说明
- 在不确定参数具体类型的时候,可以使用泛型,代替具体类型。
- 泛型可用于类和方法,泛型用于代替具体类型。
声明
类
声明1 2 3
| 作用域 class 类名<泛型1, 泛型2…>{ … }
|
接口
声明1 2 3
| interface 接口名<泛型1, 泛型2…>{ … }
|
方法
TODO: 多个泛型参数?
声明1 2 3
| 作用域 <泛型>返回类型 方法名 (泛型){ … }
|
e.g.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class Test<T1, T2>{ T1 a; T2 b; public T1 getA(){ return T1; } public void setB(T2 b){ this.b = b } }
public class Gen{ public <T>T print(T t){ System.out.print(t.toString()); } }
|
调用
类名<具体类型1, 具体类型2> 对象名 = new 类名<具体类型1, 具体类型2>();
e.g.1 2 3 4 5 6 7 8
| Test<int , string> myTest = new Test<int ,String>(); ArrayList<String> arrL = new ArrayList<String>(); Test<double , double> myTest2 = …….(); int a = myTest.getA()
for(int i = 0 ;i< arrL.size(); i++){ String s = arrL.get(i); }
|
通配符
<?> 无限制通配符
e.g.1 2 3 4 5 6 7 8 9
| public void say(Test<int, String> s){ System.out.println(s.getA()); }
public void print(Test<?,?> s){ System.out.println(s.getA()); }
|
extends/supper 子类/父类通配符
<? extends classA> 表示参数类型必须是classA的子类
<? supper classB> 表示参数类型必须是classB的父类
e.g.1 2 3 4 5 6 7 8 9 10 11 12
| ArrayList<? extends People> ….
public void speak(Gen<? extends People> p){ … }
Gen<Student> g = new Gen<Student>(); Gen<Dog> d = new Gen<Worker>() speak(g);
|