// 運(yùn)行時(shí)報(bào)錯(cuò)
Object[] objectArray = new Long[1];
objectArray[0] = "I don't fit in"; // Throws ArrayStoreException
// 無(wú)法編譯通過(guò)
List<Object> ol = new ArrayList<Long>(); // Incompatible types
ol.add("I don't fit in");
public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
public void push(Object e) {
ensureCapacity();
elements[size++] = e;
}
public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null; // Eliminate obsolete reference
return result;
}
// 這種會(huì)有警告
public static Set union(Set s1, Set s2) {
Set result = new HashSet(s1);
result.addAll(s2);
return result;
}
//這種是安全的
public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
Set<E> result = new HashSet<>(s1);
result.addAll(s2);
return result;
}
遞歸類型限制
public static <E extends Comparable<E>> E max(Collection<E> c) {
if (c.isEmpty()) throw new IllegalArgumentException("Empty collection");
E result = null;
for (E e : c){
if (result == null || e.compareTo(result) > 0){
result = Objects.requireNonNull(e);
}
}
return result;
}
//考慮以下這種,如果pushAll方法是public void pushAll(Iterable<E> src) 則會(huì)報(bào)錯(cuò),因?yàn)閰?shù)化類型是不變的。
Stack<Number> numberStack = new Stack<>();
Iterable<Integer> integers = ... ;
numberStack.pushAll(integers);
//可以變成這種, 這樣增加靈活性。生成棧使用的E實(shí)例使用extend
public void pushAll(Iterable<? extends E> src)
// 消費(fèi)棧使用的E實(shí)例使用super
public void popAll(Collection<? super E> dst)
// 所有Comparable和Comparator都是消費(fèi)者
返回類型仍然是Set <E>。 不要使用限定通配符類型作為返回類型
靈活性體現(xiàn)
// 無(wú)界類型參數(shù)
public static <E> void swap(List<E> list, int i, int j);
// 無(wú)界通配符:該方式優(yōu)于上一個(gè)方式,但是由于無(wú)界通配符類型無(wú)法修改,即需要借助helper進(jìn)行修改,但這對(duì)于調(diào)用者無(wú)需關(guān)心。
public static void swap(List<?> list, int i, int j) {
swapHelper(list, i, j);
}
private static <E> void swapHelper(List<E> list, int i, int j) {
list.set(i, list.set(j, list.get(i)));
}
public class Favorites {
private Map<Class<?>, Object> favorites = new HashMap<>();
public <T> void putFavorite(Class<T> type, T instance) {
favorites.put(Objects.requireNonNull(type), instance);
}
public <T> T getFavorite(Class<T> type) {
return type.cast(favorites.get(type));
}
}
如果你嘗試保存你最喜歡的List <String>,程序?qū)⒉荒芫幾g。 原因是無(wú)法獲取List <String>的Class對(duì)象。 List <String> .class是語(yǔ)法錯(cuò)誤,也是一件好事。 List <String>和List <Integer>共享一個(gè)Class對(duì)象