【女:“一天中最幸福的时刻就是下班后你骑自行车载着我到街角那边吃卤肉饭。”
男:“说实话。”
女:“你骑自行车载我去吃卤肉饭。”
男:“说实话。”
女:“卤肉饭……”】
java开发中如何更好使用范型???
以下来自《Effective Java》读书笔记:
参考高手文章:
http://www.cnblogs.com/nayitian/archive/2013/08/08/3245496.html
http://www.cnblogs.com/TwoWaterLee/p/5878056.html
参数化类型,通配符类型和原生态类型对比:
无限制通配类型和原生态类型的区别是:通配符类型是安全的,原生态类型不安全。你可以将任何元素放入到原生态类型的集合中,但不能将除了null之外的其他任何元素放到Collection
参考高手文章:
http://blog.csdn.net/lqadam/article/details/52563155
要尽可能地消除每一个非受检的警告。
使用@SuppressWarnings(“unchecked”)注解,需要注意的是将该注解用在尽可能小的范围内,能在变量上使用的不在方法上使用,能在方法上使用的不在类上使用。
使用@SuppressWarnings注解时,都要添加一条注释,说明为什么这么做是类型安全的
下面的代码片段是合法的,却是不符合预期:
// 运行时候失败
Object[] objectArray = new Long[1];
objectArray[0] = “I don’t fit in”; // Throws ArrayStoreException
但下面这段代码则不合法,但却提醒了你怎样才能达到预期:
// Won’t compile!
List<Object> o1 = new ArrayList<Long>(); // Incompatible types
o1.add(“I don’t fit in”);
明显,利用列表可以在编译时发现错误。我们当然希望在编译时发现错误了。
总结:数组是协变的,数组是具体化的:在运行时才知道并检查它们的元素类型约束。
定义泛型方法语法格式如下:
http://www.cnblogs.com/iyangyuan/archive/2013/04/09/3011274.html
参考高手文章:
http://www.cnblogs.com/cutter-point/p/5883279.html
修改前:
//这里使用原生类型是不合理的
public static Set union1(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<E>(s1);
result.addAll(s2);
return result;
}
参考高手文章:
http://www.cnblogs.com/13jhzeng/p/5726511.html
先看下面例子:
修改之前:
public void pushAll(Iterable<E> src) {
for (E e : src) {
push(e)
}
}
修改之后:
//src是生成者,所以使用extend
public void pushAll(Iterable<? extends E> src) {
for (E e : src) {
push(e)
}
}
pushAll的输入参数类型不应该为”E的Iterable接口”,而应该为”E的某个子类型的Iterable接口”,有一个通配符类型正符全此意:Iterable
参考高手文章:
http://blog.csdn.net/zhang_amao/article/details/52107612
http://blog.csdn.net/tkd03072010/article/details/7722110
public Class Favorites{
public <T> void putFavorite(Class<T> type, T instance);
public <T> T getFavorites(Class<T> type);
}
Favorites实例是类型安全的:当你向它请求String的时候,不会返回一个Integer给你。同时它也是异构的:不像普通的map,它的所有的键都是不同类型的。因此,我们将Favorites称作类型安全的异构容器
Map不能保证键和值之间的类型关系,即不能保证每个值的类型都与键的类型相同,当你考虑到这个问题时,可以尝试使用类型安全的异构容器:
public class Favorites {
private Map<Class<?>, Object> favorites =
new HashMap<Class<?>, Object>();
public <T> void putFavorites(Class<T> type, T instance) {
if(type == null)
throw new NullPointerException();
favorites.put(type, type.cast(instance));
}
public <T> T getFavorites(Class<T> type) {
return type.cast(favorites.get(type));
}
}
来自三毛《稻草人手记》
如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎转载,点赞,顶,欢迎留下宝贵的意见,多谢支持!