java泛型繼承
『壹』 java 中的 -> 是什麼意思
「->」是Java 8新增的Lambda表達式中,變數和臨時代碼塊的分隔符,即:
(變數)->{代碼塊}
如果代碼塊只有一個表達式,大括弧可以省略。如果變數類型可以自動推斷出來,可以不寫變數類型。
『貳』 JAVA泛型有什麼作用泛型是實泛型還是偽泛型
泛型好處:
泛型簡單易用
類型安全 泛型的主要目標是實現java的類型安全。 泛型可以使編譯器知道一個對象的限定類型是什麼,這樣編譯器就可以在一個高的程度上驗證這個類型
消除了強制類型轉換 使得代碼可讀性好,減少了很多出錯的機會
Java語言引入泛型的好處是安全簡單。泛型的好處是在編譯的時候檢查類型安全,並且所有的強制轉換都是自動和隱式的,提高代碼的重用率。
泛型的實現原理
泛型的實現是靠類型擦除技術 類型擦除是在編譯期完成的 也就是在編譯期 編譯器會將泛型的類型參數都擦除成它的限定類型,如果沒有則擦除為object類型之後在獲取的時候再強制類型轉換為對應的類型。 在運行期間並沒有泛型的任何信息,因此也沒有優化。
泛型不考慮繼承
List 類型 是否 可以 賦值為 List類型 ?
答案是不可以的
雖然說在賦值之後 String類型可以當做 Object類型使用 但是還是會出現問題
參考:《2020最新Java基礎精講視頻教程和學習路線!》
『叄』 Java中定義泛型<T>時,怎麼獲得泛型的類型
T.getClass()或缺清者T.class都是非法的,因為T是泛型變數。
由於一個類的類型是什麼是宴扮梁在編譯期處理的,故不能在運行時直接在Base里得到T的實際類型。
有一種變通的實現方式:
import java.lang.reflect.Array;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class Generic extends Base<String> {
public static void main(String[] args) {
Generic c = new Generic();
System.out.println(c.array);
}
Object array ;
public Generic() {
array = Array.newInstance(getGenericType(0), 100);
}
}
class Base<T> {
public Class getGenericType(int index) {
Type genType = getClass().getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0) {
throw new RuntimeException("Index outof bounds");
}
if (!(params[index] instanceof Class)) {
return Object.class;
}
return (Class) params[index];
}
}
其中Base<T>是泛型類,在父類中晌運聲明getGenericType,子類繼承具體的Base<String>,那麼在子類中就可以通過getGenericType(0)獲取到String的class.