以下のコードには、への参照が含まれています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言語仕様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)であり、; ...
P1
Pn
P1
P2
Pn
G<...>
P1
G<...>
したがって、上記の例では、コンパイラーはEnum<Thread.State>
、そのパラメーター化が適切なメソッドを検索するためのEnum
スーパータイプでありThread.State
、f2
例と同じ結果になると推測する必要があります。無意味な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]
コメントを追加