(明示的にそのインタフェースを実装せずに)インタフェースのメソッドを実装するクラスは、その特定のインターフェイスを拡張していますか?

Liviu Florescu:

私は、割り当て可能なオブジェクト格納するクラスを実装していますダブル値を。このような理由から、私が作成したHasDoubleValueの単一のメソッドが含まれているインタフェースを、:

public interface HasDoubleValue{
    public double doubleValue();
}

私のメインクラスは、次のように定義されます

Data <O extends HasDoubleValue> {...}

私は店の整数にこのクラスを初期化しようとすると、今、私は整数を実装ものの、エラー「整数型の変数Oの範囲内にない型引数」取得のdoubleValue()はデフォルトでメソッドを。

私はそれが私が探しています方法を持っているものの、整数を明示的に、私のHasDoubleValueインタフェースを実装していないため、この問題が発生したと仮定します。これは正しいですか?自然の回避策は何でしょうか?

JB Nizet:

はい、それは正しいです。Javaは、JavaScriptや活字体としてダックタイピングを使用していません。

解決策は、整数をラップアダプタクラスを作成し、それに委譲し、実際にインタフェースを実装することです。

または、inthis場合ので、あなたのインターフェースは、機能インタフェースである、整数からHasDoubleValueのインスタンスを作成するために、ラムダまたはメソッド参照を使用します。

public interface HasDoubleValue{
    double doubleValue();
}

final class IntegerHasDoubleValueAdapter implements HasDoubleValue {
    private final Integer i;

    public IntegerHasDoubleValueAdapter(Integer i) {
        this.i = i;
    }

    @Override
    public double doubleValue() {
        return i.doubleValue();
    }
}

class Data<O extends HasDoubleValue> {
    void put(O o) {}

    public static void main(String[] args) {
        Integer i = 42;

        Data<IntegerHasDoubleValueAdapter> d1 = new Data<>();
        d1.put(new IntegerHasDoubleValueAdapter(i));

        Data<HasDoubleValue> d2 = new Data<>();
        d2.put(() -> i.doubleValue());

        Data<HasDoubleValue> d3 = new Data<>();
        d3.put(i::doubleValue);
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=204089&siteId=1