泛型

2018-01-13  本文已影响0人  李军_6eaa
为什么在泛型中,不要使用原始类型(不带类型参数的泛型)?比如要使用List<?>,不要简单的使用List
if (o instanceof Set) {       // Raw type
    Set<?> s = (Set<?>) o;    // Wildcard type
    ...
}
泛型中,Set<String>,Set<Object>,Set<?>,以及Set的区别?
在泛型中,相对于Array,为什么优先使用List?
Sub 是 Super的子类型,Sub[] 也是 Super[]的子类型

而List是不变的(invariant),即对于两个不同的类型Type1 和 Type2,则List<Type1>既不是List<Type2>的子类型,也不是List<Type2>的超类型。

拥抱泛型
如何使用有边界通配符以增加API的灵活性?
为什么尽量不要把泛型(generics)和不定参数(varargs)混合使用
解释泛型中的type token(类型标记)
public class Favorites {
    private Map<Class<?>, Object> favorites = new HashMap<>();

    public <T> void putFavorite(Class<T> type, T instance) {
        favorites.put(Objects.requireNonNull(type), type.cast(instance));
    }

    public <T> T getFavorite(Class<T> type) {
        return type.cast(favorites.get(type));
    }

    public static void main(String[] args) {
         Favorites f = new Favorites();
         f.putFavorite(String.class, "Java");
         f.putFavorite(Integer.class, 0xcafebabe);
         f.putFavorite(Class.class, Favorites.class);
         String favoriteString = f.getFavorite(String.class);
         int favoriteInteger = f.getFavorite(Integer.class);
         Class<?> favoriteClass = f.getFavorite(Class.class);
         System.out.printf("%s %x %s%n", favoriteString, favoriteInteger, favoriteClass.getName());
    }
}
上一篇下一篇

猜你喜欢

热点阅读