泛型的擦除和补偿机制问题

莘爸爸 2017-08-16 09:28:56

public class Genericity{
public static void main(String[] args) {
A<Integer> a = new A();
Object o = a.show(); //没有报错,o得到一个字符串"123"
Object o2 = a.show().toString(); //报错,在toString之前加载了ClassLoader.java中的loadClass(),抛出ClassCastException
}
}

class A<E>{
E show(){
ArrayList arrayList = new ArrayList();
arrayList.add("123");
E o = (E)arrayList.get(0).toString(); //没有报错,强制转型也没有发生,o为字符串"123"
System.out.println(o);
return (E)arrayList.get(0);
}
}

在这里,为什么只有Object o2 = a.show().toString();这里会报错,泛型擦除补偿机制的触发条件是什么
...全文
236 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
青年卫大师 2017-08-17
  • 打赏
  • 举报
回复
源码

public class Fanxing {
	public static void main(String[] args) {
		A<Integer> a = new A<Integer>();
		Object o = a.show();
		Object o2 =a.show().toString();
	}
	
	static class A<E>{
		E show(){
			
			return (E)"123";
		}
		
	}
}
反编译后的代码

public class Fanxing
{
  public static void main(String[] args)
  {
    Fanxing.A a = new Fanxing.A();
    Object o = a.show();
    Object o2 = ((Integer)a.show()).toString();
  }

  static class A<E>
  {
    E show() {
      return "123";
    }
  }
}
天涯若风 2017-08-17
  • 打赏
  • 举报
回复
需要重写tostring
莘爸爸 2017-08-17
  • 打赏
  • 举报
回复
引用 3 楼 w2556089 的回复:
源码

public class Fanxing {
	public static void main(String[] args) {
		A<Integer> a = new A<Integer>();
		Object o = a.show();
		Object o2 =a.show().toString();
	}
	
	static class A<E>{
		E show(){
			
			return (E)"123";
		}
		
	}
}
反编译后的代码

public class Fanxing
{
  public static void main(String[] args)
  {
    Fanxing.A a = new Fanxing.A();
    Object o = a.show();
    Object o2 = ((Integer)a.show()).toString();
  }

  static class A<E>
  {
    E show() {
      return "123";
    }
  }
}
大概就是这个意思,问题是为什么o等号右边没有触发类型转换但o2触发了呢,还是补偿机制有什么规则吗

50,545

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧