3

重複の可能性:
`List<Dog>`は`List<Animal>`のサブクラスですか?Javaのジェネリックが暗黙的に多形ではないのはなぜですか?

何が起こっているのかを理解するのに助けが必要です。

私はインターフェースを持っています

public interface Foo {

  Map<String, ParameterValue> getParameters();
}

public interface ParameterValue { }

そしてFooの実装。

class FooImpl implements Foo {
   Map<String, ParameterValueImpl> parameters = new HashMap<String, ParameterValueImpl>();
   //ParameterValueImpl an implementation of ParameterValue

@Override
    public Map<String, ParameterValue> getParameters() {
        return ((Map<String,ParameterValue>) parameters);
    }   

}

次のエラーが発生します

[ERROR] Failed to execute goal
failure [ERROR]
src/main/java/domainJPA/model/FooImpl.java:[92,45]
inconvertible types [ERROR] found   :
java.util.Map<java.lang.String,domainJPA.model.ParameterValueImpl>
[ERROR] required:
java.util.Map<java.lang.String,domain.model.ParameterValue>

FooのインターフェースでParameterValueを使用する必要があります。また、FooImplでは、@ Entityとjpaが必要とするため、ParameterValue(ParameterValueImpl)の実装のみを行う必要があります。

このコードをコンパイルするにはどうすればよいですか?

編集

回答の1つで提案されているようにコードを変更すると? extends ParameterValue、Fooインターフェイスを使用できなくなります。

次のコードはコンパイルエラーになります:The method put(String, capture#8-of ? extends ParameterValue) in the type Map<String,capture#8-of ? extends ParameterValue> is not applicable for the arguments (String, ParameterValueImpl)

foo.getParameters().put("test", new ParameterValueImpl);

4

2 に答える 2

6

考えてみてください。からの戻り値getParameters()が実際にであるMap<String, ParameterValueImpl>場合、から派生する値をマップに追加することはできますが、から派生することはParameterValueできませんParameterValueImpl。そうすることで型安全性を破ることになります。

これを修正するには、次の2つのオプションがあります。

  1. getParameters()、マップを正しいタイプの新しいマップにコピーします。
  2. Map<String, ParameterValue>のタイプとして使用しFooImpl.parametersます。
于 2012-11-09T15:51:31.307 に答える
5

インターフェイスメソッドを次のように変更できます。-

Map<String, ? extends ParameterValue> getParameters();

Stringこれで、マップとを実装する任意のタイプを返すことができますParameterValue

次に、このメソッドの実装に型キャストは必要ありません。

public Map<String, ? extends ParameterValue> getParameters() {
    return parameters;
}   

または、ParameterValueImpl型インスタンスをParameterType参照に格納できるため、クラス内で次のように変更することもできMapます。-FooImpl

Map<String, ParameterValue> parameters = new HashMap<String, ParameterValue>();

その後、元の方法が機能します。

于 2012-11-09T15:52:36.877 に答える