0

bridge メソッドの作成についていくつか質問があります。共変オーバーライドにブリッジ手法を適用できます。公式ヘルプの例を考えてみましょう:

public class Node<T>{
    private 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");
         this.data=data;
    }
}

bridge メソッドは作成しません。したがって、実行時にクラスMyNodeには 2 つのメソッドがあります。setData(Integer)setData(Object)last は から継承されNodeます。私たちが呼んでいるときは、 が呼び出さsetData(new Inetegr(5))setData(Integer)ます。書くObject o= new Integer(5); setData(o);setData(Object)呼び出されます。それは本当ではない。2つの質問:

  1. ブリッジ工法を導入する理由を正しく理解していますか?
  2. ブリッジ工法作成の必要十分条件とは?
4

2 に答える 2

2

ブリッジ工法を導入する理由を正しく理解していますか?

私はイエスと思う。コンパイラがブリッジ メソッドを生成しなかった場合、サブクラスのメソッドは、オーバーライドされたバージョンではなく、スーパー クラス メソッドのオーバーロードされたバージョンになります。すでにお分かりのようです。

ブリッジ工法作成の必要十分条件とは?

パラメーター化された型を拡張または実装すると、型消去によってスーパー クラスのメソッドのシグネチャが変更されます。

書くとObject o= new Integer(5); setData(o);setData(Object)呼び出されます。それは本当ではない。

それが何を意味するのか理解できません。非汎用コードでこの動作をテストする必要があります。メソッドがオーバーロードされると、渡されたパラメーターの宣言された型に基づいて、コンパイル時に決定されるメソッドにメソッド呼び出しがバインドされます。この場合の宣言された型は であるため、バージョンObjectを呼び出しsetData(Object)ます。

于 2013-10-06T06:26:11.040 に答える