生の型へのメソッド参照は有害ですか?

ヤクブ・ボチェンスキー

以下のコードには、への参照が含まれていますEnum::name(タイプパラメーターがないことに注意してください)。

public static <T extends Enum<T>> ColumnType<T, String> enumColumn(Class<T> klazz) {
    return simpleColumn((row, label) -> valueOf(klazz, row.getString(label)), Enum::name);
}

public static <T, R> ColumnType<T, R> simpleColumn(BiFunction<JsonObject, String, T> readFromJson,
        Function<T, R> writeToDb) {
 // ...
}

Javacは、コンパイル中に警告を報告します。

[警告] raw型が見つかりました:java.lang.Enumジェネリッククラスjava.lang.Enumの型引数がありません

式をに変更するEnum<T>::nameと、警告が消えます。

ただし、IdeaEnum<T>::nameは、次の警告でバージョンにフラグを立てます。

明示的な型引数を推測できます

同様に、Eclipse(ECJ)は、どちらの定式化でも問題を報告しません。

3つのアプローチのどれが正しいですか?

一方では、生のタイプはかなり厄介です。他の型の引数を入れようとEnum<Clause>::nameすると、たとえばコンパイルが失敗するため、追加の保護になります。

一方、上記の参照はe -> e.name()ラムダと同等であり、この定式化は型引数を必要としません。

環境:

  • Java 8:91
  • IDEA15.0.3コミュニティ
  • ECJ 4.5.2
ホルガー

「生のメソッドリファレンス」のようなものはありません。ジェネリック以前のコードの移行を支援するために生の型が存在しますが、ジェネリック以前のメソッド参照を使用することはできないため、「互換モード」はなく、型推論が標準です。Java言語仕様15.13。メソッド参照式の状態:

メソッドまたはコンストラクターが汎用の場合、適切な型引数を推測するか、明示的に指定することができます。同様に、メソッド参照式で言及されているジェネリック型の型引数は、明示的に提供することも、推測することもできます。

メソッド参照式は常にポリ式です

したがって、::型引数を指定せずにジェネリッククラスを参照する場合、「生型」の前の型を呼び出すことができますが、コンパイラは、ターゲット関数型に従ってジェネリック型シグネチャを推測します。そのため、ここでは「raw型の使用法」に関する警告を生成しても意味がありません。

たとえば、

BiFunction<List<String>,Integer,String> f1 = List::get;
Function<Enum<Thread.State>,String> f2 = Enum::name;

javac警告なしでコンパイルできます(仕様では、型が推測される類似の例を示しています)。

Function<Thread.State,String> f3 = Enum::name;

警告を生成します。仕様書は述べている。この場合について:

2番目の検索では、、...が空はなくReferenceTypeのサブタイプである場合、メソッド参照式は、タイプ、...、。の引数式を持つメソッド呼び出し式であるかのように扱われます場合のReferenceTypeが生型であり、このタイプのパラメータが存在する、つまりはスーパータイプで検索するタイプに適用されるキャプチャ変換の結果(§5.1.10)であり、; ...P1PnP1P2PnG<...>P1G<...>

したがって、上記の例では、コンパイラーはEnum<Thread.State>、そのパラメーター化が適切なメソッドを検索するためのEnumスーパータイプでありThread.Statef2と同じ結果になると推測する必要があります。無意味なraw型の警告を生成しますが、どういうわけか機能します。


どうやら、javac適切なスーパータイプを検索する必要がある場合のみこの警告が生成されるため、あなたのケースには簡単な解決策があります。正確なタイプを使用して検索してください。

public static <T extends Enum<T>> ColumnType<T, String> enumColumn(Class<T> klazz) {
    return simpleColumn((row, label) -> valueOf(klazz, row.getString(label)), T::name);
}

これは警告なしにコンパイルされます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

url.openStreamは有害ですか?

分類Dev

GCCでのコンパイル:-O3は有害ですか?

分類Dev

ハードディスクの電源を切ることは有害ですか?

分類Dev

Thread.Sleepがとても有害なのはなぜですか

分類Dev

「hstart.exe」は私のコンピュータに有害ですか?

分類Dev

有害なのWeakHashMap非同期ですか?

分類Dev

メソッド参照ラムダの明示的な型ヒントは生の型になります

分類Dev

列挙型参照変数をメソッド自体の外で宣言できないのはなぜですか?

分類Dev

Java 8のインスタンスメソッド参照型の違いは何ですか?

分類Dev

後で呼び出すためにJavaメソッドへの参照を取得することは可能ですか?

分類Dev

Javaで非静的メソッドへの静的参照を作成するにはどうすればよいですか?

分類Dev

怠惰なキーワードはメモリやパフォーマンスに有害ですか?

分類Dev

Arrayメソッドへの参照を保存するにはどうすればよいですか?

分類Dev

'StringSet型から非静的メソッドadd(String)への静的参照を作成できない'の問題

分類Dev

インスタンスメソッドへの参照はJava8でシリアル化できますか?

分類Dev

メソッドへの参照を使用して、Python unittest.TestCaseから単一のテストメソッドを実行することは可能ですか?

分類Dev

サブモジュールメソッドへの動的参照が必要ですか?

分類Dev

フィールドの初期化によって引き起こされる有害なコード爆発の実際の例は何ですか?

分類Dev

匿名型のメンバーを参照するメソッドを匿名型に追加できますか?

分類Dev

アップロードされた画像が実際の画像であり、有害なコードではないことを確認する方法は?

分類Dev

ラップトップをワイヤレス電話の充電器の近くまたは上に置くことは有害ですか?

分類Dev

モバイルアプリから複数のAPIを呼び出すことは有害ですか?

分類Dev

配列とIList <>を返すことの違いは何ですか?(RE:エリックリペットの有害な配列)

分類Dev

update-apt-xapiの実行中に100%のCPU使用率は有害ですか?

分類Dev

Java 8:[メソッド]への参照があいまいです

分類Dev

それを拡張しないクラスメソッドで抽象クラスメソッドへの参照を作成することは可能ですか?

分類Dev

それを拡張しないクラスメソッドで抽象クラスメソッドへの参照を作成することは可能ですか?

分類Dev

JavaScriptの「新しい」キーワードは有害と見なされますか?

分類Dev

SELECT *が有害であると見なされるのはなぜですか?

Related 関連記事

  1. 1

    url.openStreamは有害ですか?

  2. 2

    GCCでのコンパイル:-O3は有害ですか?

  3. 3

    ハードディスクの電源を切ることは有害ですか?

  4. 4

    Thread.Sleepがとても有害なのはなぜですか

  5. 5

    「hstart.exe」は私のコンピュータに有害ですか?

  6. 6

    有害なのWeakHashMap非同期ですか?

  7. 7

    メソッド参照ラムダの明示的な型ヒントは生の型になります

  8. 8

    列挙型参照変数をメソッド自体の外で宣言できないのはなぜですか?

  9. 9

    Java 8のインスタンスメソッド参照型の違いは何ですか?

  10. 10

    後で呼び出すためにJavaメソッドへの参照を取得することは可能ですか?

  11. 11

    Javaで非静的メソッドへの静的参照を作成するにはどうすればよいですか?

  12. 12

    怠惰なキーワードはメモリやパフォーマンスに有害ですか?

  13. 13

    Arrayメソッドへの参照を保存するにはどうすればよいですか?

  14. 14

    'StringSet型から非静的メソッドadd(String)への静的参照を作成できない'の問題

  15. 15

    インスタンスメソッドへの参照はJava8でシリアル化できますか?

  16. 16

    メソッドへの参照を使用して、Python unittest.TestCaseから単一のテストメソッドを実行することは可能ですか?

  17. 17

    サブモジュールメソッドへの動的参照が必要ですか?

  18. 18

    フィールドの初期化によって引き起こされる有害なコード爆発の実際の例は何ですか?

  19. 19

    匿名型のメンバーを参照するメソッドを匿名型に追加できますか?

  20. 20

    アップロードされた画像が実際の画像であり、有害なコードではないことを確認する方法は?

  21. 21

    ラップトップをワイヤレス電話の充電器の近くまたは上に置くことは有害ですか?

  22. 22

    モバイルアプリから複数のAPIを呼び出すことは有害ですか?

  23. 23

    配列とIList <>を返すことの違いは何ですか?(RE:エリックリペットの有害な配列)

  24. 24

    update-apt-xapiの実行中に100%のCPU使用率は有害ですか?

  25. 25

    Java 8:[メソッド]への参照があいまいです

  26. 26

    それを拡張しないクラスメソッドで抽象クラスメソッドへの参照を作成することは可能ですか?

  27. 27

    それを拡張しないクラスメソッドで抽象クラスメソッドへの参照を作成することは可能ですか?

  28. 28

    JavaScriptの「新しい」キーワードは有害と見なされますか?

  29. 29

    SELECT *が有害であると見なされるのはなぜですか?

ホットタグ

アーカイブ