6

我正在检查 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);
}
4

2 回答 2

5

不,你不能这样做,因为在继承的情况下它不会给你引用类型的类,而是实际对象类型的类。

考虑这个例子:

Number num = new Integer(4);
System.out.println(num.getClass());

这将打印:

class java.lang.Integer

而不是java.lang.Number

于 2013-08-07T16:42:47.610 回答
0

我实际上总是需要其他方法(使用 .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}
    }
}
于 2018-03-12T12:58:32.727 回答