例如, 假设某个应用程序具有两个类库 X 和 Y,并且 Y 还要使用类库 Z。随着JavaSE5 的出现,这个应用程序和这些类库的创建者最终可能希望迁移到泛型上。但是,当进行这种迁移时,他们有着不同动机和限制。为了实现迁移兼容性,每个类库和应用程序都必须与其他所有的部分是否使用了泛型无关。这样,它们必须不具备探测其他类库是否使用了泛型的能力。因此,某个特定的类库使用了泛型这样的证据必须被擦除。
public class ArrayList1{
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("str");
List integers = new ArrayList<>();
integers.add(123);
System.out.println(list.getClass());
System.out.println(integers.getClass());
System.out.println(integers.getClass() == list.getClass());
}
}
//运行结果为
true
我们定义两个ArrayList数组 ,不过一个是 List 泛型类型,只能保存字符串 ,一个是List 类型,只能保存 整型。
我们通过 list 和 integers 对象的getClass() 获取它们的类的信息,最后结果发现为 true。说明了泛型类型 String 和Integer 都被擦除掉了,只剩下原始类型。
class ArrayList2{
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
List list=new ArrayList<>();
list.add(1);
//利用反射进行添加数据asd
list.getClass().getMethod("add",Object.class).invoke(list,"asd");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
//运行结果为
1
asd
//以前写法
List list=new ArrayList();
//现在写法
List lists=new ArrayList();
//如果是与以前的代码兼容,各种引用传值之间,必然会出现如下情况
List list1=new ArrayList<>();
和
List list2=new ArrayList();
//arrayList 源码
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
可以看到,在return 之前会根据泛型变量进行强转。
//写了个简单的程序
public class ArrayList5 {
public static void main(String[] args) {
List list1 = new ArrayList<>();
list1.add("1234");
String s = list1.get(0);
}
}
//反编译如下
public class generic.ArrayList5 {
public generic.ArrayList5();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2 // class java/util/ArrayList
3: dup
4: invokespecial #3 // Method java/util/ArrayList."":()V
7: astore_1
8: aload_1
9: new #4 // class java/util/Date
12: dup
13: invokespecial #5 // Method java/util/Date."":()V
16: invokevirtual #6 // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
19: pop
20: aload_1
21: iconst_0
22: invokevirtual #7 // Method java/util/ArrayList.get:(I)Ljava/lang/Object;
25: checkcast #4 // class java/util/Date
28: astore_2
29: return
}
list.get(0) 方法 方法返回值是一个Object 类型 说明类型擦除了
然后在 checkcast #4 操作之后跳转到 #4 如 new #4 class java/util/Date 是一个Date类型,即做了Date 类型转换。 所以它不是在get 方法强转的 是在你调用的地方强转的。
附一个checkcast解释
checkcast checks that the top item on the operand stack (a reference to an object or array) can be cast to a given type. For example, if you write in Java:
return ((String)obj);
then the Java compiler will generate something like:
aload_1 ; push -obj- onto the stack
checkcast java/lang/String ; check its a String
areturn ; return it
checkcast is actually a shortand for writing Java code like:
if (! (obj == null || obj instanceof )) {
throw new ClassCastException();
}
// if this point is reached, then object is either null, or an instance of
// or one of its superclasses.
3),类型擦除与多态冲突和解决方案
//现在有一个泛型类
public class Pair {
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
//我们想要一个子类继承它
public class DataClass extends Pair{
@Override
public Date getT() {
return super.getT();
}
@Override
public void setT(Date date) {
super.setT(date);
}
}
在平时工作中,难免会遇到把 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