java泛型的类型擦除,为什么show方法打印的也是String 10
publicclasssolution{publicstaticvoidmain(String[]args){generich<String>mh=newgenerich...
public class solution {
public static void main(String[] args) {
generich<String> mh = new generich<>();
mh.push("1");
mh.show();
System.out.println(mh.get().getClass().getSimpleName());
}
}
class generich<T>{
private Object[] obj;
public generich(){obj = new Object[5];}
public Object get(){
return obj[0];
}
public void show(){
System.out.println(obj[0].getClass().getSimpleName());
}
public void push(T factor){
obj[0] = factor;
}
}
为什么两个打印都是String,第二个擦除后不该是Object吗 展开
public static void main(String[] args) {
generich<String> mh = new generich<>();
mh.push("1");
mh.show();
System.out.println(mh.get().getClass().getSimpleName());
}
}
class generich<T>{
private Object[] obj;
public generich(){obj = new Object[5];}
public Object get(){
return obj[0];
}
public void show(){
System.out.println(obj[0].getClass().getSimpleName());
}
public void push(T factor){
obj[0] = factor;
}
}
为什么两个打印都是String,第二个擦除后不该是Object吗 展开
1个回答
展开全部
/*
这问题丢几天了无人问津:我说说我个人的理解,不足之处还请指点!
mh.get() 这个方法获取的是obj[0]字符串对象:"1";
mh.get().getClass().getSimpleName()==>"1".get().getClass().getSimpleName();
你可以直接测试打印:System.out.println("1".get().getClass().getSimpleName());
------------------------------------------------------------------------------
show方法里面:
拿的是Object数组0索引值:obj[0]="1";
obj[0].getClass().getSimpleName()==>"1".get().getClass().getSimpleName();
--------------------------------------------------------------------------------
你是不是疑惑,为什么obj[0]会是字符串,不是提升成了Object了吗?
因为你在使用push方法进行存储的时候,就已经擦除泛型了,直接使用的是字符串类型了
其实很好测试,你把泛型定义成Object,然后你传入:一个数字:,一个字符串;
然后你调用:show方法会得到Integer和String,数字不是对象在push的时候就会封装成对象!
当前使用getClass方法的时候,系统调用的是底层,功能读取Class文件对象,可以获取它很多属性
比如:getSimpleName()
-------------------------------------------------------------------------------
这就好比:你的泛型T,不管他是什么,但必须是对象,都是Object子类,都具备一个方法toString
相同:字节码文件的对象既Class对象,也都具备自己的公开方法如:getSimpleName()
可能有些不是很好理解,需要多测试测试才行!*/
追问
是不是意味着类似于多态,getSimpleName()直接调用的是对象本身的该方法,含有该对象的信息,而不是Object中的getSimpleName方法?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询