Collections.emptyList () gibt eine Liste <Object> zurück?

Ich habe Probleme beim Navigieren in Javas Regel, um auf generische Typparameter zu schließen. Betrachten Sie die folgende Klasse mit einem optionalen Listenparameter:

import java.util.Collections;
import java.util.List;

public class Person {
  private String name;
  private List<String> nicknames;

  public Person(String name) {
    this(name,Collections.emptyList());
  }

  public Person(String name,List<String> nicknames) {
    this.name = name;
    this.nicknames = nicknames;
  }
}

Mein Java-Compiler gibt den folgenden Fehler aus:

Person.java:9: The constructor Person(String, List<Object>) is undefined

AberCollections.emptyList() gibt Typ @ zurü<T> List<T>, nichtList<Object>. Das Hinzufügen einer Besetzung hilft nicht

public Person(String name) {
  this(name,(List<String>)Collections.emptyList());
}

ergibt

Person.java:9: inconvertible types

UsingEMPTY_LIST Anstatt vonemptyList()

public Person(String name) {
  this(name,Collections.EMPTY_LIST);
}

ergibt

Person.java:9: warning: [unchecked] unchecked conversion

Wenn die folgende Änderung den Fehler beseitigt:

public Person(String name) {
  this.name = name;
  this.nicknames = Collections.emptyList();
}

Kann mir jemand erklären, gegen welche Typüberprüfungsregel ich hier verstoße und wie ich das am besten umgehen kann? In diesem Beispiel ist das endgültige Codebeispiel zufriedenstellend, aber bei größeren Klassen möchte ich in der Lage sein, Methoden nach diesem "optionalen Parameter" -Muster zu schreiben, ohne Code zu duplizieren.

Für zusätzliches Guthaben: Wann ist es angebracht, @ zu verwendeEMPTY_LIST im Gegensatz zuemptyList()?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage