不知道大家对于java泛型是怎么理解的?
大家认为泛型到底有什么作用了?
泛型只能存放指定类型的数据,底层对此进行了处理,我们只能对存取指定类型的数据
很多人一定是这么理解的吧,但实际上并不是哦,泛型只是为了规范在编译的时候对泛型做了判断,为了方便我们存取,减少编程错误,其实底层编译成字节码的时候并没有任何泛型,和jdk1.5之前其实是没区别的,如果我们绕开编译,那完全可以存放其他类型的数据
如何绕开,我们可以利用反射,大家看看下面的代码
package a;
import java.util.ArrayList;
import java.util.List;
public class A {
public A(String s) {
slist.add(s);
}
private List<String> slist = new ArrayList<>();
public List<String> getSlist() {
return slist;
}
public void setSlist(List<String> slist) {
this.slist = slist;
}
}
首先我们定义了这么一个类,里面有一个带着泛型的list
然后
package a;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.List;
public class B {
public static void main(String[] args) throws Exception {
A a1 = new A("测试数据");
Class clazz =Class.forName("a.A");
Method m =clazz.getMethod("getSlist", null);
List la = (List) m.invoke(a1, null);
la.add(new ben());
List la1=(List) m.invoke(a1, null);
System.out.println(la1);
}
}
class ben{
int i=1;
String s="4";
@Override
public String toString() {
return "ben [i=" + i + ", s=" + s + "]";
}
}
大家觉得最后打印的结果是什么呢
[测试数据, ben [i=1, s=4]]
结果是这样的,你没看错,我在泛型为String的集合里面放了一个自定义的类,如果泛型的编译的时候真的做了处理,那么在la.add(new ben());这一句的时候应该抛出类型转换异常
怎么样,是不是大吃一惊,发现和自己知道的完全不一样?(大神请无视)