0

次のような宣言を見たのを覚えています。

private static Logger log = Logger.getLogger(<>.class);

利点は、誤って別のクラスのロガーになることなく、クラスからクラスに貼り付けることができることでした。

今、私はそれをコンパイルすることができません.構文が間違っているに違いありません. では、<> はそれ自体 (ArrayList<>() などではなく) で正確に何に解決されるのでしょうか?

ありがとうございました

アップデート:

それが合法的な構文であるという私の主張は、次のことから来ています。

  1. 私はそれを合法的で気の利いたトリックとしてウェブ上で見ました.
  2. 私と同僚の両方がJava 7でIntelliJに貼り付け、正しくコンパイルしました。

とはいえ、そのページに再びアクセスできる検索が見つからず、今すぐコンパイルすることもできません! したがって、コンパイラまたは Java 仕様の知識を持つ誰かが、それが有効かどうか、およびデフォルトが何であるかを明確に述べてくれることを願っています。

4

1 に答える 1

3

Java 5 および 6 では、ジェネリック クラスの新しいインスタンスを宣言する必要があった場合*、次の構文を使用する必要がありました。

List<String> myList = new ArrayList<String>();

ジェネリックの宣言時に型推論はありませんでした。

Java 7の登場により、コンパイラーは型推論について 1 つまたは 2 つのトリックを学びました。

コンパイラがそれを推測できる場合、呼び出されたときにダイヤモンド演算子を使用すると<>、Java 7 以降で上記のコードと同じ結果が生成されます。

List<String> myList = new ArrayList<>();

もちろん、それができない状況もあります。これは、上記のリンクされた例から借用したものです。

List<String> list = new ArrayList<>();
list.add("A");
// The following statement should fail since addAll expects
// Collection<? extends String>

list.addAll(new ArrayList<>());

ここにあるのは無効なコードです:

private static Logger log = Logger.getLogger(<>.class);

実際にはそのメソッドに具体的なものを渡す必要がありClass、Java はそのコンテキストでそれを推論することはできません。

*: ジェネリック メソッドがそれほど悪かったかどうかは覚えていませんが、当時は Java 6 で多くの開発を行っていませんでした。

于 2015-01-14T03:36:47.397 に答える