我是新來的java.I仍然覺得我必須瞭解很多,所以如果這個問題似乎愚蠢的原諒我。 現在我正在通過http://docs.oracle.com/javase/tutorial/java/generics/bridgeMethods.html橋法如何工作?
在這裏,我發現了很多困惑。
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 class MyNode extends Node<Integer> {
public MyNode(Integer data) {
super(data);
}
public void setData(Integer data) {
System.out.println("MyNode.setData");
super.setData(data);
}
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"); // Causes a ClassCastException to be thrown.
Integer x = mn.data;
}
}
當我運行這段代碼我得到以下錯誤
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at MyNode.setData(MyNode.java:1)
at MyNode.main(MyNode.java:14)
下面是混亂
1)爲什麼顯示如果通過他們說,博客閱讀1號線
2)類型擦除將取代以上代碼類型參數如下
public class Node {
private Object data;
public Node(Object data) { this.data = data; }
public void setData(Object data) {
System.out.println("Node.setData");
this.data = data;
}
}
public class MyNode extends Node {
public MyNode(Integer data) { super(data); }
public void setData(Integer data) {
System.out.println(data);
super.setData(data);
}
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"); // Causes a ClassCastException to be thrown.
//Integer x = mn.data
}
}
whe n個I運行上面的代碼我沒有得到任何錯誤,代碼運行正常
從文檔中兩個R相同?爲什麼這種行爲上的不同對OOP
現在其他最重要的問題是,當我們繼承一個類,當我們調用超構造雖然超級對象沒有創建那麼什麼是使用調用超。請解釋。
那麼,如果你說的電橋法將增加,很抱歉,如果我理解力完全地你的answere – sumedha
@sumedha是爲什麼第一個例子失敗,橋接方法被添加。這並不是真的導致您在'main'中調用方法失敗。這完全是內部的。問題是,你正在向該方法傳遞一個String類型的參數(這正是一個橋接方法),然後在內部嘗試將該參數強制轉換爲一個'Integer'類型,這是失敗的地方。 –
如果第二個示例具有橋接方法的副本,那麼爲什麼它在第二個示例中失敗,請exaplain – sumedha