java类,继承generic method 后,不能调用superclass的函数 报错-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

java类,继承generic method 后,不能调用superclass的函数 报错

2020-05-25 15:57:56 544 1

"

我是java的初学者。
我对java泛型中的erase特别想不通
有一个例子

public class Node<T> {

public T data;

public Node(T data) { this.data = data; }

public void setData(T data) {
    System.out.println("Node.setData");
    this.data = data;
}

public void set(T data){
    System.out.println("Node.set");
    this.data=data;
}

}

public class MyNode extends Node<Integer> { public MyNode(Integer data) { super(data); }

public void setData(Integer data) {
    System.out.println("MyNode.setData");
    super.setData(data);
}

}

照理来说,经过了erase之后,Node这个类就可以改写成为:

public class Node {

    public Object data;

    public Node(Object data) { this.data = data; }

    public void setData(Object data) {
        System.out.println("Node.setData");
        this.data = data;
    }

    public void set(Object data){
        System.out.println("Node.set");
        this.data=data;
    }
}

由于MyNode继承了Node,所以MyNode有两个setData method:
void setData(Object data)和public void setData(Integer data).
现在,如果我有一个main()来运行代码:

class Solution {
    public static void main(String[] args) {
        MyNode mn = new MyNode(5);
        Node n = mn;            // A raw type - compiler throws an unchecked warning
        n.setData("Hello");
    }
}

照理来说,虽然根据多态,run-time的时候会先搜索到public void setData(Integer data),但是当JVM发现不匹配的时候,应该会去运行super class的public void setData(Object data),因此不应该run-time error.
并且,根据https://docs.oracle.com/javas... 照理来说,这段代码应该也是没问题的。
但是我运行的时候出现了

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at MyNode.setData(MyNode.java:1)
at Solution.main(Solution.java:83)

但是,这段代码却可以正常运行:

public static void main(String[] args) {
        MyNode mn = new MyNode(5);
        Node n = mn;
        // inherit set from the Node            
        n.set("Hello");
}

所以,为什么同样是继承了public函数,如果subclass中没有同名的method,superclass的method是可以被正常调用的,但是如果有同名的method,superclass的method就不能正常运行了?

java版本:

java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

" ![image.png](https://ucc.alicdn.com/pic/developer-ecology/6104d7ae596344f69f93fdbfc24877bc.png)
取消 提交回答
全部回答(1)
  • 因为相信,所以看见。
    2020-05-25 22:54:25

    "

    对于编译器来说,它理解你的MyNode#setData(Integer data) 是要覆盖父类Node#setData(Object data)
    所以会生成一个桥方法MyNode#setData(Object data)用于重写父类的setData方法。

    MyNode#setData实现如下

    public void setData(Object obj){ //所以出现了ClassCastException setData((Integer)obj); }

    " image.png

    0 0
相关问答

0

回答

请问java性能问题:如何优化向HashMap插入元素的速度?

2021-11-12 17:18:18 131浏览量 回答数 0

0

回答

请问java中使用BigDecimal计算操作性能最优的做法是什么?

2021-11-07 15:42:19 204浏览量 回答数 0

1

回答

java性能问题:有没有比较字符串是否相等的最快方法?

2021-11-06 16:21:40 162浏览量 回答数 1

0

回答

您好java性能问题:有没有比较字符串是否相等的最快方法?

2021-11-07 00:39:14 138浏览量 回答数 0

1

回答

java性能问题:如何优化向HashMap插入元素的速度?

2021-11-06 15:41:34 206浏览量 回答数 1

1

回答

java中常用的性能调优诊断工具都有哪些,请帮忙提供一下?

2021-11-06 10:24:39 151浏览量 回答数 1

0

回答

请问java中常用的性能调优诊断工具都有哪些,请帮忙提供一下?

2021-11-06 22:35:44 84浏览量 回答数 0

1

回答

java中使用BigDecimal计算操作性能最优的做法是什么?

2021-11-06 16:35:15 222浏览量 回答数 1

1

回答

java中ArrayBlockingQueue与DoubleBufferedQueue哪个性能更高?

2021-11-06 21:47:49 201浏览量 回答数 1

1

回答

java中DoubleBufferedQueue与ArrayBlockingQueue哪个性能更高?

2021-11-06 21:50:01 180浏览量 回答数 1
+关注
因为相信,所以看见。
阿里,我所有的向往
0
文章
1438
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载