it-swarm.com.de

Wie behebe ich "Der Ausdruck vom Typ Liste muss nicht markiert werden ..."?

Im Java Snippet:

SyndFeedInput fr = new SyndFeedInput();
SyndFeed sf = fr.build(new XmlReader(myInputStream));
List<SyndEntry> entries = sf.getEntries();

die letzte Zeile generiert die Warnung

Msgstr "Der Ausdruck vom Typ List muss ungeprüft konvertiert werden, um mit List<SyndEntry> Übereinzustimmen."

Was ist ein geeigneter Weg, um dies zu beheben?

128
user46277

Da getEntries ein unformatiertes List zurückgibt, kann es alles enthalten.

Die warnungsfreie Methode besteht darin, ein neues List<SyndEntry> Zu erstellen und dann jedes Element des sf.getEntries() -Ergebnisses in SyndEntry umzuwandeln, bevor es Ihrer neuen Liste hinzugefügt wird. Collections.checkedList Erledigt nicht diese Überprüfung für Sie - obwohl es möglich gewesen wäre, es zu implementieren, um dies zu tun.

Wenn Sie Ihre eigene Vorauswahl treffen, "halten Sie sich an die Garantiebedingungen" von Java Generics: Wenn ein ClassCastException ausgelöst wird, wird dies einer Einspielung zugeordnet Der Quellcode, keine unsichtbare Umwandlung, die vom Compiler eingefügt wurde.

94
erickson

Dies ist ein häufiges Problem beim Umgang mit APIs vor Java 5. Um die Lösung von erickson zu automatisieren, können Sie die folgende generische Methode erstellen:

public static <T> List<T> castList(Class<? extends T> clazz, Collection<?> c) {
    List<T> r = new ArrayList<T>(c.size());
    for(Object o: c)
      r.add(clazz.cast(o));
    return r;
}

Dies ermöglicht Ihnen Folgendes:

List<SyndEntry> entries = castList(SyndEntry.class, sf.getEntries());

Da diese Lösung mithilfe einer Umwandlung überprüft, ob die Elemente tatsächlich den richtigen Elementtyp haben, ist sie sicher und erfordert kein SuppressWarnings.

111
Bruno De Fraine

Es sieht so aus, als ob SyndFeed keine Generika verwendet.

Sie können entweder eine unsichere Besetzung und eine Warnungsunterdrückung haben:

@SuppressWarnings("unchecked")
List<SyndEntry> entries = (List<SyndEntry>) sf.getEntries();

oder rufen Sie Collections.checkedList auf - obwohl Sie die Warnung noch unterdrücken müssen:

@SuppressWarnings("unchecked")
List<SyndEntry> entries = Collections.checkedList(sf.getEntries(), SyndEntry.class);
25
Jon Skeet

Hast du das SyndFeed geschrieben?

Gibt sf.getEntries Eine Liste oder List<SyndEntry> Zurück? Ich vermute, es gibt List zurück, und wenn Sie es in List<SyndEntry> Ändern, wird das Problem behoben.

Wenn SyndFeed Teil einer Bibliothek ist, können Sie die Warnung meines Erachtens nicht entfernen, ohne die Annotation @SuppressWarning("unchecked") zu Ihrer Methode hinzuzufügen.

7
Alex B

Wenn Sie Guava verwenden und alles, was Sie tun möchten, ist, Ihre Werte zu durchlaufen:

for(SyndEntry entry: Iterables.filter(sf.getEntries(), SyndEntry.class){
  ...
}

Wenn Sie eine aktuelle Liste benötigen, können Sie diese verwenden

List<SyndEntry> list = Lists.newArrayList(
    Iterables.filter(sf.getEntries(), SyndEntry.class));

oder

List<SyndEntry> list = ImmutableList.copyOf(
    Iterables.filter(sf.getEntries(), SyndEntry.class));
2

Wenn Sie sich das Javadoc für die Klasse SyndFeed ansehen (ich nehme an, Sie beziehen sich auf die Klasse com.Sun.syndication.feed.synd.SyndFeed), Gibt die Methode getEntries () nicht Java.util.List<SyndEntry> Zurück, sondern kehrt zurück nur Java.util.List.

Dafür benötigen Sie eine explizite Besetzung.

1
Shyam
SyndFeedInput fr = new SyndFeedInput();
SyndFeed sf = fr.build(new XmlReader(myInputStream));
List<?> entries = sf.getEntries();
1
Honglonglong

Wenn Sie @SuppressWarning nicht bei jedem Aufruf von sf.getEntries () aktivieren möchten, können Sie immer einen Wrapper erstellen, der List zurückgibt.

Siehe diese andere Frage

0
Boune

Sogar einfacher

return new ArrayList<?>(getResultOfHibernateCallback(...))

0
DennisTemper