0

次のようなインターフェースがあるとします。

public interface Foo<T> {
    T doSomething();
}

さて、次の両方が許されますか?

public class Bar implements Foo<Number> { ... }

public class Bar2 extends Bar implements Foo<Integer> { ... }

Bar2. _ Foo_ Integer_ Number_ 一方、これは共変の戻り値の型の場合ではないでしょうdoSomething()か。それとも、コンパイラはそのように検出するほど賢くないのでしょうか?

4

2 に答える 2

0

これはインターフェースではなく、クラス (またはキーワードも欠落している抽象クラスabstract) のようです。次のようにする必要があります:-

public interface Foo<T> {
        T doSomething();
}

その上

public class Bar implements Foo<Number> { ... }

public class Bar2 extends Bar implements Foo<Integer> { ... }

コンパイル時エラーが発生します。 The interface Foo cannot be implemented more than once with different arguments: Foo<Number> and Foo<Integer>

しかし、代わりに行う場合:-

public class Bar implements Foo<Integer> { ... }

public class Bar2 extends Bar implements Foo<Integer> { ... }

これはコンパイル時エラーを発生させませんdoSomething()。Bar2 で実装する場合は、実行時にそれを考慮します:-

Bar2 bar2=new Bar2();
bar2.doSomething();

それ以外の場合は、doSomething()から実行されますBar

そして明らかにあなたがそうするなら:-

Bar bar=new Bar();
bar.doSomething();

今回は1つしか実装されていないため、doSomething()を考慮します。つまり、の(インターフェースを実装しているため、実装する必要があります:))BardoSomething()BarBarFoo

于 2014-11-24T06:41:22.910 に答える