83. <E, F extends E> void unsafeAdd(List<? super E> list, F o) {
list.add(o);
}
List<String> list = new ArrayList<>(List.of("foo"));
unsafeAdd(list, 100L); // compile error
87. List<String> someEntry() {
return List.of("bar"); //
}
List<String> list = new ArrayList<>(List.of(“foo"));
list.addAll(someEntry());
88. IV. null
• null
• ArrayList<E>/LinkedList<E>/Arrays.asList()/
HashSet<E>/HashMap<K,V>
• null
• List.of()/Set.of()/Map.of() /
TreeSet<E>/TreeMap<E>
• API
89. null
List<String> someEntry() {
List<String> list = new ArrayList<>();
list.add(null);
list.add("foo");
return list;
}
List<String> list = new ArrayList<>(List.of(“bar"));
list.addAll(someEntry());
return List.copyOf(list)); // NullPointerException
!
90. null
: null add
( )
List<String> someEntry() {
List<String> list = new ArrayList<>();
list.add("foo");
return list;
}
List<String> list = new ArrayList<>(List.of("bar"));
list.addAll(someEntry());
return List.copyOf(list));
91. null
: ArrayList
findbugs/spotbugs
class ListBuilder<E>{
final List<E> list = new ListBuilder<>();
final add(@Nonnull E e) {
list.add(e);
}
}
List<String> someEntry() {
ListBuilder<String> listBuilder = new ListBuilder<>();
listBuilder.add("foo");
return listBuilder.getList();
}