簡體   English   中英

將對象插入類型安全的異構容器時,為什么需要類引用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM