2

Javaでは、サブクラスインスタンスをクラスタイプのフィールドに割り当てることができます。次に例を示します。

public class BaseClass {

}

public class SubClass extends BaseClass {

}

public class Example {

    private BaseClass field1;

    public void assign(SubClass subclass) {
        field1 = subclass; // is OK
    }

}

Javaでは、インターフェースを型として使用することもできます。インターフェイスがある場合Fooable

public interface Fooable {
    void foo();
}

私たちのExampleクラスは、タイプのフィールドを持つことができますFooable

    Fooable field2;

つまり、インターフェイスfield2を実装する任意のクラスのインスタンスに割り当てることができFooableます。

しかし、インターフェイスのインスタンスと実装の両方field3である必要があるコンパイラに通知したい場合はどうなりますか?だから、クラスがあればBaseClassFooable

public class FooSubClass extends BaseClass implements Fooable {
    @Override
    public void foo() {
        // TODO
    }
}

field3、のインスタンスに割り当てることはできますが、割り当てることはできFooSubClassませんSubClassか?ジェネリックを使用せずにそれは可能ですか?

4

3 に答える 3

8

あなたがしようとしているようにそれを行うことはできません。

別のクラスを定義する必要があります。おそらく、ここでは抽象クラスが適しています。

public class abstract AbstractSubClass extends BaseClass implements Fooable {
    ...
}

次にFooSubClass

public class FooSubClass extends AbstractSubClass {
    ...
}

次に、あなたのフィールドは次のとおりです。

private AbstractSubClass field1;

受け入れるFooSubClassが受け入れないSubClass

これは、field1が実際に必要なすべてのメソッドの実装を持つことをコンパイラーが保証できる唯一の方法です。


これは説明するための教科書の例です:

public class Bird() {
    public void eat() { 
        ....
    }
}

public interface FlyingBehaviour() {
    void fly();
}

public abstract class FlyingBird extends Bird implements FlyingBehaviour() {
    ...
}

public class Eagle extends FlyingBird {
    ...
}

public class Penguin extends Bird {
    ...
}

FlyingBird bird = new Eagle();
bird.fly();

FlyingBird bird = new Penguin(); //Compilation Error - Penguins cant fly!
于 2013-03-13T17:18:33.573 に答える
1

Javaには、オブジェクトフィールドが2つの異なるクラスを継承/実装することを保証する方法はありません。ここですべてのオブジェクトを制御できると仮定すると、最も簡単な修正は、基本クラスがFooableを実装することです。

于 2013-03-13T17:24:44.040 に答える
0

フィールドの設定にassign-methodを使用しているため、そのメソッドでinstanceofを使用して、オブジェクトのタイプが正しいかどうかを確認できます。

public void assign(BaseClass baseClass) {
    if (baseClass instanceof foo)
       field3 = baseClass;
}

fooを実装していないクラスが提供されている場合は、例外をスローできます。

編集:Doh、修正がコンパイル時のものであるべきだとは思わなかった。

于 2013-03-13T17:23:14.103 に答える