1. 程式人生 > 遊戲攻略 >《原神攻略》神裡綾華技能解析及裝備推薦

《原神攻略》神裡綾華技能解析及裝備推薦

1.泛型的概念

泛型,即“引數化型別”。就是將型別由原來的具體的型別引數化,類似於方法中的變數引數,此時型別也定義成引數形式(可以稱之為型別形參),然後在使用/呼叫時傳入具體的型別(型別實參)。泛型的使用包括泛型類,泛型介面與泛型方法。

2.泛型存在的意義

2.1 既然泛型可以將我們給類,方法或介面中定義的型別轉化為變數一樣的存在,也就是說泛型可以幫助我們減少程式碼的重複率(適用於多種資料型別執行相同的程式碼)。
public static void main(String[] args) {
//現在有個需求是要打印出傳入的陣列中的所有元素。
//1. 如果沒有泛型,那麼我們會分別過載不同型別的列印陣列的方法,
// 但是有了泛型我們就可以只寫一個泛型類接收所有型別的陣列。
// 所有基礎資料型別都要轉換為相應的包裝類才能被接收。
Boolean[] booleans = {true, true, false, true};
Integer[] ints = {10, 11, 12, 13};
Double[] doubles = {20.1, 20.2, 20.3};
Character[] chars = {'a', 'b', 'c', 'd'};
String[] strings = {"張三", "李四", "王二", "麻子"};
printArray(booleans);
printArray(ints);
printArray(doubles);
printArray(chars);
printArray(strings);
}

//列印不同型別的陣列的泛型方法。
private static <T> void printArray(T[] array) {
for (T element : array) {
System.out.print(element + ",");
}
System.out.println();
}

//執行結果
//true,true,false,true,
//10,11,12,13,
//20.1,20.2,20.3,
//a,b,c,d,
//張三,李四,王二,麻子,
2.2 泛型中的型別在使用時指定,不需要強制型別轉換(型別安全,編譯器會檢查型別)

3.泛型的使用

3.1 泛型類
public class Demo9 <T> {
private T data;

public T getData() {
return data;
}

public void setData(T data) {
this.data = data;
}

public static void main(String[] args) {
Demo9<String> stringDemo = new Demo9<>();
stringDemo.setData("泛型類");
System.out.println(stringDemo.getData());
Demo9<Integer> intDemo = new Demo9<>();
intDemo.setData(123456789);
System.out.println(intDemo.getData());
}
}
3.2 泛型介面
public interface Demo10 <T> {
T getData();
}

/**
* 實現方法一:指定泛型介面具體型別。
*/
class MethodOne implements Demo10<String> {
String data;

public void setData() {
this.data = data;
}

@Override
public String getData() {
return data;
}
}

/**
* 實現方法二:不指定泛型介面具體型別,交給新建立物件時去確定,也就是還是一個泛型類。
* @param <T> 泛型引數
*/
class MethodTwo<T> implements Demo10<T> {
T data;

public void setData() {
this.data = data;
}

@Override
public T getData() {
return data;
}
}
3.3 泛型方法
public static void main(String[] args) {
//現在有個需求是要打印出傳入的陣列中的所有元素。
//1. 如果沒有泛型,那麼我們會分別過載不同型別的列印陣列的方法,
// 但是有了泛型我們就可以只寫一個泛型類接收所有型別的陣列。
// 所有基礎資料型別都要轉換為相應的包裝類才能被接收。
Boolean[] booleans = {true, true, false, true};
Integer[] ints = {10, 11, 12, 13};
Double[] doubles = {20.1, 20.2, 20.3};
Character[] chars = {'a', 'b', 'c', 'd'};
String[] strings = {"張三", "李四", "王二", "麻子"};
printArray(booleans);
printArray(ints);
printArray(doubles);
printArray(chars);
printArray(strings);
}

//列印不同型別的陣列的泛型方法。
private static <T> void printArray(T[] array) {
for (T element : array) {
System.out.print(element + ",");
}
System.out.println();
}

4.萬用字元型別

4.3 泛型的引數型別支援萬用字元型別。<?>中?代表沒有限制的泛型型別。
4.2 泛型的引數型別可以使用extends語句。<? extends Number>中,extends並不代表繼承,而是表示?的範圍必須是在Number型別的子型別中。這樣寫告訴編譯器這個類一定是Number的子類。所以在寫入資料時編譯器只知道傳入了一個Number或者Number下的子類,但是具體傳入了哪個子類不知道。在訪問資料時,編譯器返回一個Number型別的值,這是編譯器可以確定的。
4.3 泛型的引數型別支援super語句。<? super T>中,super表示型別的下界,表示引數化型別是T或者T的父型別。傳入資料時編譯器知道一定是T或T的父型別,但是具體是什麼型別不知道,訪問資料時會返回一個Object型別的資料。

5.泛型限制類型

5.1 在使用泛型時,可以指定泛型的限定區域,例如:必須是某某類的子類或某某介面的實現類,格式:<T extends 類或介面1 & 介面2>。比如有一個泛型的限制是<T extends List & Serializable>,那麼在使用這個泛型時,< Integer >中Integer沒有實現List & Serializable這兩個介面就是不符合限制的,而< ArrayList >就是符合限制的。

6.泛型使用的一些注意事項

1、泛型引數列表可以有多個泛型,中間用逗號隔開。例如< T,V,E... >,這些引數都可以進行型別的限制。 2、靜態變數或方法不能引用泛型型別變數,但是靜態泛型方法是可以的。 3、基本型別無法作為泛型型別。 4、無法使用instanceof關鍵字或==判斷泛型類的型別。 5、泛型類的原生型別與所傳遞的泛型無關,無論傳遞什麼型別,原生類是一樣的。 6、泛型陣列可以宣告但無法例項化。 7、泛型類不能繼承Exception或者Throwable。 8、不能捕獲泛型型別限定的異常但可以將泛型限定的異常丟擲。 9、對於泛型引數是繼承關係的泛型類之間是沒有繼承關係的。 10、泛型類可以繼承其它泛型類,例如: public class ArrayList< E > extends AbstractList< E >。 11、泛型類的繼承關係在使用中同樣會受到泛型型別的影響。

7.泛型的實現

7.1 在編譯之後程式會採取去泛型化的措施。也就是說Java中的泛型,只在編譯階段有效。在編譯過程中,正確檢驗泛型結果後,會將泛型的相關資訊擦除,並且在物件進入和離開方法的邊界處新增型別檢查和型別轉換的方法。也就是說,泛型資訊不會進入到執行時階段。
7.2 Java泛型是Java1.5之後才引入的,為了向下相容。Java採用了C++完全不同的實現思想。Java中的泛型更多的看起來像是編譯期用的。Java中泛型在執行期是不可見的,會被擦除為它的上級型別。如果是沒有限定的泛型引數型別,就會被替換為Object。
GenericClass<String> stringGenericClass=new GenericClass<>();
GenericClass<Integer> integerGenericClass=new GenericClass<>();
C++中GenericClass< String >和GenericClass< Integer >是兩個不同的型別,Java進行了型別擦除之後統一改為GenericClass< Object >

部分轉載: 作者:JayDroids 連結:https://www.jianshu.com/p/986f732ed2f1 來源:簡書 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。