大家认为泛型到底有什么作用了?
泛型只能存放指定类型的数据,底层对此进行了处理,我们只能对存取指定类型的数据
很多人一定是这么理解的吧,但实际上并不是哦,泛型只是为了规范在编译的时候对泛型做了判断,为了方便我们存取,减少编程错误,其实底层编译成字节码的时候并没有任何泛型,和jdk1.5之前其实是没区别的,如果我们绕开编译,那完全可以存放其他类型的数据
如何绕开,我们可以利用反射,大家看看下面的代码
class="java" name="code">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());这一句的时候应该抛出类型转换异常
怎么样,是不是大吃一惊,发现和自己知道的完全不一样?(大神请无视)
?
?