泛型類
常見的泛型類的使用:容器 Map<K ,V>
public class Container{
private String key;
private String value;
public Container(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
Container 類中保存類一對 key-value (String - String ) 鍵值對 , 但是該種寫法的可擴展性較差,如果需要保存一對 key-value (Integer - String ),那么該類不符合要求,要做的就是在重新定義一個類進行相關的操作。雖然可以通過 Object 來代替 String ,但是這樣靈活性還是不夠,只不過這次將數(shù)據(jù)類型定義為更高的數(shù)據(jù)類型而已。而泛型則實現(xiàn)了不指定數(shù)據(jù)類型,只有到了運行時才能夠知道具體的數(shù)據(jù)類型是什么。
栗子:
public class Cantainer < K , V >{
private K key;
private V value;
public Cantainer(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public V getValue() {
return value;
}
public void setValue(V value) {
this.value = value;
}
}
在編譯期間是無法知道具體的 K 和 V 是什么數(shù)據(jù)類型, 只有在運行時才會真正的根據(jù)具體的數(shù)據(jù)類型來進行構造和分配內(nèi)存。
對泛型類的具體使用:
public class Main {
public static void main(String[] args) {
Container<String, String> c1 = new Container<String, String>("key", "value");
Container<String, Integer> c2 = new Container<String, Integer>("age", 24);
Container<Double, Double> c3 = new Container<Double, Double>(1.1, 2.2);
System.out.println(c1.getKey() + " : " + c1.getValue());
System.out.println(c2.getKey() + " : " + c2.getValue());
System.out.println(c3.getKey() + " : " + c3.getValue());
}
}
輸出:
key : value
age : 24
1.1 : 2.2
泛型接口
具體栗子:
public interface Generator<T>{
public T next();
}
public class MyGenerator implements Generator<String>{
@Override
public String next(){
return "泛型類 返回值 generator";
}
}
需要注意的是在實現(xiàn)接口時要指明具體的數(shù)據(jù)類型 Generator<String>
具體調(diào)用:
public class Main {
public static void main(String[] args) {
MyGenerator generator = new MyGenerator();
System.out.println(generator.next());
}
}
輸出:
泛型類 返回值 generato
在相應類的具體實現(xiàn)中(具體實現(xiàn)指的是:接口 Generator 的實現(xiàn)類 MyGenerator 指定MyGenerator<String>)可以指定接口泛型 T 的數(shù)據(jù)類型(本栗子中指定 T 的數(shù)據(jù)類型為 String ),從而指定了接口方法的數(shù)據(jù)返回值類型--String 。
泛型方法
一個基本的原則: 無論如何,只要你能做到,就應該使用泛型方法. 也就是說,如果泛型方法能將整個類泛化,那么應該優(yōu)先使用泛型方法。
栗子說明泛型方法的定義:
public class Method
{
public static <T> void out (T t){
System.out.print(t);
}
public static void main(String[] args) {
out("124");
out(true);
out(124);
}
}
注意: <T>是為了規(guī)范參數(shù);T表示的是返回值類型.
從上面的栗子我們可以看到方法的參數(shù)徹底泛型化了,這個過程涉及到編譯器的類型推導和自動打包,也就是說原來我們需要自己對類型進行判斷和處理,現(xiàn)在這些事情編譯器幫我們完成了。這樣的話,在定義方法的時候就不必考慮以后到底需要處理哪些類型的參數(shù),這樣大大的增加了編程的靈活性。