3

単なる好奇心から、変数を 2 つの型に割り当てることは可能ですか?

この件については専門用語がはっきりしていないので、少し明確にさせてください。通常、静的タイプと動的タイプがあります。

Animal a = new Dog();

動的タイプが静的タイプを継承する必要がある場合:

public class Dog extends Animal {...}

しかし、動的型が複数の型を拡張/実装することを保証することは可能ですか?

Dogクラスを拡張してAnimalインターフェースを実装する必要があるように?

私は次のようなものを想像します:

Animal [implements Happy] a = new Dog();

私はそれがただのクレイジーな話だと確信していますが、それは可能ですか?そうでない場合、最も近い代替手段は何ですか?

これは、変数が自分で作成したインターフェイスであり、編集できないクラスであることを確認する場合にのみ関連すると考えています。

私が考えることができる1つの方法は、使用するたびにキャストすることでランタイムを決定することです。

try {
    @SuppressWarnings("unused")
    Animal a = (Happy) new Dog();
} catch (ClassCastException e) {
    //Is not of type Happy
}

//Using a method from the Happy-interface
try {
    ((Happy)a).smile();
} catch (ClassCastException e) {
    //Is not of type Happy
}
4

2 に答える 2

5

いいえ、直接はできません。次のようないくつかの回避策を考えることができます。

abstract class HappyAnimal extends Animal implements Happy

そして、そのタイプを使用します。もちろん、クラスは拡張する必要があります。直接HappyAnimal拡張Animalして実装すると機能しません。Happy

于 2012-05-31T18:48:09.710 に答える
3

チェックインしたいクラスまたはメソッドのいずれかで型パラメーターを宣言することにより、ジェネリックを使用できます。

<A extends Animal & Happy> //put in class/method declaration

...

A a = new Dog();

abstractこれにより、追加のクラスを使用せずに、コンパイル時に型チェックを行うことができます。

于 2012-05-31T18:50:12.927 に答える