[英]When inserting objects into a type-safe heterogeneous container, why do we need the class reference?
我正在檢查Bloch的Effective Java中的異構容器模式,並且我試圖確定在將對象插入異構容器時需要類引用的原因。 我不能使用instance.getClass()
來獲取此引用嗎? JPA的實體經理不是這樣的一個例子嗎?
interface BlochsHeterogeneousContainer {
<T> void put(Class<T> clazz, T instance);
<T> T get(Class<T> clazz);
}
interface AlternativeHeterogeneousContainer {
// Class<T> not needed because we can use instance.getClass()
<T> void put(T instance);
<T> T get(Class<T> clazz);
}
不,你不能這樣做,因為它不會在繼承的情況下給你類引用類型,而是實際對象類的類。
考慮這個例子:
Number num = new Integer(4);
System.out.println(num.getClass());
這將打印:
class java.lang.Integer
而不是java.lang.Number
。
我實際上總是需要其他方法(使用.getClass()),所以我認為這兩種實現都很有用。
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> void putFavorite(T instance) {
favorites.put(instance.getClass(), instance);
}
public <T> T getFavorite(Class<T> type) {
return type.cast(favorites.get(type));
}
public static void main(String[] args) {
Favorites favorites = new Favorites();
Number num = new Integer(4);
favorites.putFavorite(Number.class, num); //ADDS Number -> 4
//favorites.putFavorite(Integer.class, num); //Error: no suitable method found for putFavorite(java.lang.Class<java.lang.Integer>,java.lang.Number)
favorites.putFavorite(num); //ADDS Integer -> 4
System.out.println(favorites.favorites); //{class java.lang.Integer=4, class java.lang.Number=4}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.