欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

泛型是否可以放其他类型

程序员文章站 2022-04-05 12:57:37
...

不知道大家对于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());这一句的时候应该抛出类型转换异常

怎么样,是不是大吃一惊,发现和自己知道的完全不一样?(大神请无视)

 

 

相关标签: java 泛型