java中的型別推斷是一個編譯器過程,它會自動從上下文資訊推斷出未指定的資料型別參數。考慮一個例子,我們想要建立一個泛型類別的物件。因此,為了建立這個對象,我們需要使用指定類型的參數來呼叫泛型類別的構造,例如 String、Float、Integer 等,這會增加程式碼長度。為了減少這種編碼,java提供了靈活性,只要編譯器從上下文中判斷或猜測參數的類型,就可以學習空的類型參數。除此之外java還提供了通配符,允許使用者實現類型參數的繼承。 Java 8 提供了類型推斷的改進版本。如果是類型,則不使用推理,然後編譯器會產生未經檢查的轉換警告。
開始您的免費軟體開發課程
網頁開發、程式語言、軟體測試及其他
文法如下:
Generic_class < type_parameter > obj = new Generic_class<> ( ); Where - Generic_class – Generic_class is an user create generic class. <type_parameter> - type_parameter is a type parameter, which represented by agular brakets(<>), that can have one or more type of parameter separated by commas. Obj – obj is the object of the generic class. < > − < > (diamond) represents the type inference.
接下來,我們編寫java 程式碼來更清楚地理解這一點,在下面的範例中,我們使用泛型類別建構函式建立一個泛型類別來接受值對,並為不同的資料對建立泛型類別的物件類型,然後對類型參數使用類型推斷,如下所示–
代碼:
package p1; class Pair <x, y> { private x first; private y second; public Pair(x a, y b) { first=a; second=b; } public x getFirst() { return first; } public y getSecond() { return second; } } public class Demo { public static void main( String[] arg) { // unchecked conversion warning Pair <Integer, String> ob1 = new Pair<Integer, String>(25, "Test1"); System.out.println("Integer value is : "+ob1.getFirst()); System.out.println("String valueis : "+ob1.getSecond()); System.out.println( ); // unchecked conversion warning Pair <String, Integer> ob2 = new Pair<String, Integer>("Test2", 30); System.out.println("String valueis : "+ob2.getFirst()); System.out.println("Integer is : "+ob2.getSecond()); System.out.println( ); // type inference, < > left it blank, compiler will infer type Pair <String, Integer> ob3 = new Pair<String, Integer>("Test3", 30); System.out.println("Integer valueis : "+ob3.getFirst()); System.out.println("Integer value is : "+ob3.getSecond()); System.out.println( ); // type inference, < > left it blank, compiler will infer type Pair <Integer, Integer> ob4 = new Pair< >(35, 40); System.out.println("Integer value is : "+ob4.getFirst()); System.out.println("Integer value is : "+ob4.getSecond()); System.out.println( ); } }
輸出:
說明: 如上面的程式碼所示,泛型類別 Pair 可以在類別中包含兩種不同的資料類型,即 x 和 y。這裡,前兩個物件是透過在兩側明確提及整數和/或字串類型創建的,它們是 Java 的早期版本。在最後兩個物件建立範例中,類型在一側提及(我們可以將第二側留空),這是在Java 7中引入的。稍後介紹在不明確提及類型的情況下呼叫指定方法java 8 中的參數,我們將在下一個範例中看到。
接下來,我們編寫java程式碼來理解新的類型推斷,其中我們使用泛型類別的setter方法建立一個泛型類別來接受不同類型的訊息,並為不同的訊息創建泛型類別的物件不同的資料類型,然後對類型參數進行類型推斷,如下:
代碼:
package demo; class myGeneric < x > { private x msg; public x getMsg() { return msg; } public void setMsg(x msg) { this.msg = msg; } public String genInf1(myGeneric <String> m){ m.setMsg( "This is a Hello Message." ); return m.msg; } public Integer genInf2(myGeneric <Integer> m){ m.setMsg( 100 );; return m.msg; } } public class Demo { public static void main(String[] args) { // Before java 7 an old approach to create generic class object myGeneric <String> msg1 = new myGeneric <String>(); msg1.setMsg( "This is a first Message."); System.out.println(msg1.getMsg()); // type inference myGeneric <Integer> msg2 = new myGeneric <>(); msg2.setMsg(20); System.out.println(msg2.getMsg()); // New type inference System.out.println(msg1.genInf1( new myGeneric<>() )); System.out.println(msg1.genInf2( new myGeneric<>() )); System.out.println(msg2.genInf1( new myGeneric<>() )); System.out.println(msg2.genInf2( new myGeneric<>() )); } }
輸出:
說明: 如上面的程式碼所示,呼叫特定的(genInf1() 和genInf2()) 方法而不明確提及參數類型,這是java 8 中引入的新類型推斷的範例。
接下來,我們編寫程式碼來理解新類型推斷,其中我們使用List 泛型類別建立訊息列表,並為不同資料類型的不同訊息建立列表泛型類別的對象,然後使用類型參數的類型推斷和新類型推斷,如下:
代碼:
package demo; import java.util.ArrayList; import java.util.List; public class Demo { public static void main( String[] arg) { // Before Java 7 to create a list List <String> msg1 = new ArrayList <String>(); msg1.add("This is a first Message."); getMsg(msg1); // Java 7 type inference List<String> msg2 = new ArrayList<>(); msg2.add("This is a second Message."); getMsg(msg2); // as list is generic class so add integer List<Integer> msg3 = new ArrayList<>(); msg3.add(100); getMsg1(msg3); // Java 8 Compiler type infers type of ArrayList getMsg(new ArrayList<>()); } public static void getMsg(List <String> m){ if(!m.isEmpty()){ m.forEach(System.out::println); }else System.out.println("No Message."); } public static void getMsg1(List <Integer> m){ if(!m.isEmpty()){ m.forEach(System.out::println); }else System.out.println("No Message."); } }
輸出:
類型推斷用於建立泛型類別類型的對象,如果我們希望編譯器自動從上下文傳遞推斷出未指定的資料類型參數。
以上是Java 類型推斷的詳細內容。更多資訊請關注PHP中文網其他相關文章!