5

エクリプス 3.4。Java コンパイラ レベル 1.6 JRE IBM 1.6

フォームの変更できないライブラリ クラスがあります。

import java.util.Hashtable;
public class A extends Hashtable {
  ...
}

また、A に簡単にアクセスできるようにユーティリティ クラスを作成しました。

public class B {
  private A a;
  public B() {
    this.a = new A();
  }
  public B(final A props) {
    this.a = props;
  }
  public B(final Map<String, String> props) {
    this();
    for (String key : props.keySet()) {
      add(key, props.get(key));
    }
  }
  @SuppressWarnings("unchecked")
  public B add(final String name, final Object value) {
    a.put(name, value);
    return this;
  }
}

別のクラスからコンストラクターの 1 つを呼び出そうとすると、問題が発生します。

public class C {

  public void stuff() {
    A a = new A();
    B b = new B(a);//Error in javac
  }
}

Eclipse はこれをエラーなしでコンパイルし、ant javac および jenkins を介してコンパイルすると、コンパイラーは次のようなエラーを出します。

reference to B is ambiguous, both method B(com.foo.A) in com.bar.B and method B(java.util.Map<java.lang.String,java.lang.String>) in com.bar.B match
    [javac]         B b = new B(a);

このエラーは javac で発生しますか? 私の見解では、日食はより具体的な方法を選択する上で正しいです。

4

3 に答える 3

0

問題は、1 つのコンストラクターが生の Hashtable を受け入れ、もう 1 つのコンストラクターがパラメーター化された Map を受け入れることです。両方のコンストラクターを適用できますが、 Java 言語仕様に従って、コンストラクターは、その引数が他の引数の (厳密な) サブタイプである場合にのみ、他のコンストラクターよりも具体的であるため、この場合は曖昧さ回避ロジックは機能しません。この段階では未チェックのサブタイプは許可されないため、あいまいになります。

于 2012-09-27T13:24:33.203 に答える
0

HashTable は Map を実装しているため、あいまいさがあります。Hこの回答には、いくつかの優れた洞察が含まれています。

Javaであいまいにオーバーロードされたコンストラクターを呼び出す

于 2012-09-26T07:59:57.383 に答える
-1

クラス A が Hashtable を拡張し、Hashtable 自体が Map インターフェースを実装しているため、クラス A が Map のプロパティを取得し、それも Map になると言えます。

と を持っているときは、両方のコンストラクターでmap 引数を持ってpublic B(final A props)いるpublic B(final Map<String, String> props) ようなものです。

それがあなたに曖昧さを与える理由です。

于 2012-09-26T09:18:48.423 に答える