Как избавиться от предупреждения в этом примере кода.
Я использую Eclipse Neon с Java 1.8 и org.eclipse.jdt.annotation_2.1.0.
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@NonNullByDefault
public class NullAnnotationTest4 {
public static void main(String[] args) {
final TreeMap<@Nullable Integer, @Nullable String> treeMap = new TreeMap<>();
treeMap.put(3, "Test1");
treeMap.put(null, null);
//This produces the warning
final Set<@Nullable Entry<@Nullable Integer, @Nullable String>> set = treeMap.entrySet();
for (final Iterator<@Nullable Entry<@Nullable Integer, @Nullable String>> it = set.iterator(); it.hasNext(); ) {
final Entry<@Nullable Integer, @Nullable String> entry = it.next();
if (entry != null && entry.getKey() == null && entry.getValue() != null)
System.out.println(entry.getKey()+" is mapped to "+entry.getValue());
}
}
}
Предупреждение:
Null type safety (type annotations):
The expression of type
'Set<Map.Entry<@Nullable Integer,@Nullable String>>'
needs unchecked conversion to conform to
'Set<Map.@Nullable Entry<@Nullable Integer,@Nullable String>>'
Я пробовал несколько комбинаций @Nullable и @NonNullable. Даже ? extends
, как было предложено в подобном случае здесь: https://bugs.eclipse.org/bugs/show_bug.cgi?id=507779
Но предупреждение всегда только перемещается, но никогда не уходит полностью.
Обновление:
Я избавился от предупреждения, используя эту строку:
final Set<? extends @Nullable Entry<@Nullable Integer, @Nullable String>> set = treeMap.entrySet();
Но я совершенно потерян, почему. Мне кажется, что я обманываю валидатор, теряя трек или что-то в этом роде, и код действительно начинает становиться уродливым.
Полный новый код:
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@NonNullByDefault
public class NullAnnotationTest4 {
public static void main(String[] args) {
final TreeMap<@Nullable Integer, @Nullable String> treeMap = new TreeMap<>();
treeMap.put(3, "Test1");
treeMap.put(null, null);
final Set<? extends @Nullable Entry<@Nullable Integer, @Nullable String>> set = treeMap.entrySet();
for (final Iterator<? extends @Nullable Entry<@Nullable Integer, @Nullable String>> it = set.iterator(); it.hasNext(); ) {
final Entry<@Nullable Integer, @Nullable String> entry = it.next();
if (entry != null && entry.getKey() == null && entry.getValue() != null)
System.out.println(entry.getKey()+" is mapped to "+entry.getValue());
}
}
}
Обновление 2 Коротышка вставил неверный код.
set
не должна быть простоSet<Entry<@Nullable Integer, @Nullable String>>
? Записи в наборе записей, вероятно, никогда не должны быть нулевыми. - person Jiri Tousek   schedule 22.11.2016Set<Map.Entry...
вSet<Map.@NonNull Entry..
из-за @NonNullByDefault - person Torge   schedule 22.11.2016