出现目的:我们写的类和方法,希望用的人越多越好,就像项目中经常写的公共函数。
实现一:在类定义时带一个或多个参数 : class ArrayList<E>,HashMap<K,V> 等等。
具体使用:
1、Generic class(Parameterized class) :当类定义带有参数时: class ArrayList<E>,当实例化一个类时,必须指定参数。
1>出现在类成员中: private E a;
2>出现在方法 返回 中:putlic E get(){retrun a};
3>出现在方法参数中: public void set(E a){ this.a=a;}
2、Generic methods(Parameterized method):方法定义时带参数,类还是普通类。
2.1: <T> void f(T x) :通常不需要指定具体类型,编译器自己能判断(type arguent inference)
2.2: <T> List<T> list():当方法里不带参数时,编译器猜不出返回类型是什么。需明确指定返回类型 List<T>
2.3 : <T> List<T> makeList(T... args):参数变量和返回类型都有。
makeList("a");
makeList("a","b");
一、以前用得最多“方法 参数通用”的一种方式:
polymorphism:One way that object-oriented languages allow generalization is through polymorphism
public class Music {
public static void tune(Instrument i) { //基类Instrument,实际传过来的是子类,这就是方法 (参数)成为通用。
i.play(Note.MIDDLE_C);
}
public static void main(String[] args) {
Wind flute = new Wind();
tune(flute); // Upcasting
}
}
二、类里面的成员变量成为通用型:就是在类前面加<A,B>,之后在构造函数里赋值。
TwoTuple<A, B>:A tuple library,表示是一个数组,随便加。
package generics;
public class TwoTuple<A, B> {//A,B 类里面成员变量和方法都可以使用。
public final A first;//final 表示谁用TwoTuple类,这个变量只能读,不能给变量重新赋值。
public final B second;
public TwoTuple(A a, B b) {
first = a;
second = b;
}
public String toString() {
return "(" + first + ", " + second + ")";
}
}
package generics;
import net.mindview.util.*;
public class TupleTest {
static TwoTuple<String, Integer> f() {
// Autoboxing converts the int to Integer:
return new TwoTuple<String, Integer>("hi", 47);}
public static void main(String[] args) {
TwoTuple<String, Integer> ttsi = f();
System.out.println(ttsi);
// ttsi.first = "there"; // Compile error: fina}}