raw type 可以很容易的破坏集合的约束条件,而通配符则会限制这种情况的发生(null除外), 可以配合泛型方法generic method 和有限制的通配符类型bounded wildcard type 使用
快速回顾
Set 是个参数化类型,表示可以包含任何对象类型的一个集合
Set> 则是一个通配符类型,表示只能包含某种未知对象类型的一个集合
Set则是一个原生态类型raw type,它脱离了泛型系统,不安全。
参数化类型 : List
实际类型参数:String>
泛型:List
形式类型参数:E
无限制通配符类型:List>
原生态类型:List
有限制类型参数:
递归类型限制:
有限制通配符类型:List extends Number>
泛型方法:static List func(E[] e)
类型令牌:String.class
第24条
@SuppressWarnings 注解使用
也可以使用在变量上
不能直接在return 上使用,这时创建局部变量接受返回值,然后注解
第25条 列表优先于数组
第一个区别:数组是协变(covariant) ,泛型是不可变(invariant)。
//数组,编译时合法
Object[] objects = new Long[1]; //Long 是Object的子类
objects[0] = "aa";//运行时会抛出异常 ArrayStroeException
//集合,编译时无法通过
List list = new ArrayList();//无法编译通过,类型不匹配
list.add("aa");
//raw type
public static Set union(Set s1, Set s2) {
Set result = new HashSet(s1);
result.addAll(s2);
return result;
}
//泛型方法
public static Set union(Set s1, Set s2) {
Set result = new HashSet(s1);
result.addAll(s2);
return result;
}
public interface Comparable {
int compareTo(T o);
}
类型参数T 定义的类型,可以与实现Comparable的类型的元素进行比较。
下面是如何表达这种约束条件的一个示例
public static > T max(List list){...}
类型限制> ,可以读作"针对可以与自身进行比较的每个类型T"
//示例
public static > T max(List list) {
Iterator iterator = list.iterator();
T result = iterator.next();
while (iterator.hasNext()) {
T t = iterator.next();
if (t.compareTo(result)>0) {
result = t;
}
}
return result;
}
第28条 利用有限制通配符来提升API的灵活性
extends E>
为在刚刚的Stack 类添加一个新方法pushAll(Iterable iterable)
public void pushAll(Iterable iterable) {
for (E e : iterable) {
push(e);
}
}
Stack numberStack = new Stack<>();
Iterable integers = new ArrayList<>();
numberStack.pushAll(integers);//此时编译不通过
//示例
E reduce(List list, Function function, E initVal) {...}
//修改后
E reduce2(List extends E> list, Function function, E initVal) {...}
//示例2
public static Set union(Set s1, Set s2) {...}
//修改后 ,返回类型不要含有通配符
public static Set union(Set extends E> s1, Set extends E> s2) {... }
//两者的区别在于
Set integers = new HashSet<>();
Set doubles = new HashSet<>();
//使用通配符的方法可以通过一个【显示的类型参数】来告诉要使用哪种类型
Set numbers = Math2.union(integers, doubles);
修改第27条中的max方法
public static > T max(List list)
//修改后, 应用PECS转换两次
public static > T max(List extends T> list)
//同时修改 Iterator extends T> iterator = list.iterator();
在平时工作中,难免会遇到把 XML 作为数据存储格式。面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历 XML 这块来测试,因为遍历 XML 是工作中使用最多的(至少我认为)。 预 备 测试环境: AMD 毒龙1.4G OC 1.5G、256M DDR333、Windows2000 Server
Netty 3.x的user guide里FrameDecoder的例子,有几个疑问:
1.文档说:FrameDecoder calls decode method with an internally maintained cumulative buffer whenever new data is received.
为什么每次有新数据到达时,都会调用decode方法?
2.Dec
hive> select * from t_test where ds=20150323 limit 2;
OK
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
问题原因: hive堆内存默认为256M
这个问题的解决方法为:
修改/us
Simply do the following:
I. Declare a global variable:
var markersArray = [];
II. Define a function:
function clearOverlays() {
for (var i = 0; i < markersArray.length; i++ )
Quick sort is probably used more widely than any other. It is popular because it is not difficult to implement, works well for a variety of different kinds of input data, and is substantially faster t