Java の型推論は、コンテキスト情報から未指定のデータ型パラメータを自動的に推論するコンパイラ プロセスです。ジェネリック クラス タイプのオブジェクトを作成する例を考えてみましょう。したがって、このオブジェクトを作成するには、文字列、浮動小数点、整数などの指定されたタイプのパラメーターを使用してジェネリック クラスの構造を呼び出す必要がありますが、これによりコードの長さが長くなります。このコーディングを減らすために、Java は、コンパイラーがコンテキストからパラメーターの型を判断または推測する限り、空の型パラメーターを学習する柔軟性を提供します。この Java に加えて、ユーザーが型パラメータで継承を実現できるようにするワイルドカードも提供します。 Java 8 では、型推論の改良版が提供されています。型の場合、推論は使用されないため、コンパイラーは未チェックの変換警告を生成します。
無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
構文は次のとおりです:
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( ); } }
出力:
説明: 上記のコードと同様、ジェネリック クラスのペアは、クラス内で 2 つの異なるデータ型 (x および y) を使用できます。ここで、最初の 2 つのオブジェクトは、両側で整数型および/または String 型を明示的に指定することによって作成されています。これは Java の以前のバージョンです。最後の 2 つのオブジェクト作成例では、Java 7 で導入された、一方の側で型が言及されています (<> 2 番目の側は空白のままにすることができます)。その後、型を明示的に言及せずに指定されたメソッドを呼び出すように導入されました。 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<>() )); } } </p> <p><strong>出力:</strong></p> <p><img src="https://img.php.cn/upload/article/000/000/000/172500227566935.jpg" alt="Javaの型推論" ></p> <p><strong>説明:</strong> 上記のコードのように、引数の型を明示的に指定せずに特定の (genInf1() および genInf2()) メソッドを呼び出すことは、Java 8 で導入された新しい型推論の例です。 </p> <h4>例 #3</h4> <p>次に、新しい型推論を理解するためのコードを作成します。このコードでは、List ジェネリック クラスを使用してメッセージのリストを作成し、さまざまなデータ型のさまざまなメッセージに対してリスト ジェネリック クラスのオブジェクトを作成し、以下のような型推論と型パラメータの新しい型推論:</p> <p><strong>コード:</strong></p> <pre class="brush:php;toolbar:false">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 中国語 Web サイトの他の関連記事を参照してください。