私は既存のオブジェクトのサブクラスを作成する私の会社のAPIを使って作業しています。ここでの注意点は以下のとおりです。Javaでオブジェクトをキャストする方法
は- 私は動物のサブクラスとしてスーパー 私はスーパークラスのオブジェクトが
私が最も一般的に見例インスタンス化される方法を変更することはできません
//API class, which I cannot modify
public class Animal(){
public void eat(){
//All animals can do this
}
}
今、私は動物にいくつかのメソッドを追加し、このようなクラスを作成したいと思います。
//My subclass, which I can modify
public class Dog extends Animal(){
public void fetch(){
//Only dogs can do this
}
}
ここで、私は動物のインスタンス(犬ではないもの)を持っているとしましょう。私は基本的にそれを犬に落とす必要があります。私はダウンキャスティングがJavaで直接サポートされていないことを知っていますが、これに対する回避策はありますか?
public class AnimalExample{
public static void main(String[] args){
Animal animal = MyApi.getAnAnimal();
//Dog dog = (Dog) animal; ---throws a runtime error
Dog dog = Dog.getDog(animal); //Maybe something like this?
//Then I should be able to call both eat() and fetch()
dog.eat();
dog.fetch();
}
}
ここでも、ダウンキャストは直接サポートされていないことを理解しています。しかし、これにはいくつかの回避策が必要であり、私はそれを理解することはできません。私はラッパークラス(例:DogWrapper
)を使用することができることを知っていますが、これは数十のスーパークラスメソッドを頻繁に呼び出すので、私が望むよりも少し難しいでしょう。
UPDATE:私はそれがまだ犬ではないことを理解していますが、それを犬に変換する方法があるのだろうかと思っていました。基本的には、人々が言っていることから、私は手動で(各属性/メソッドを1つずつコピーするか)Wrapperクラスを使用するかのどちらかに変換する必要があります。 Wrapperクラスのほうがはるかに面倒ではないようですので、残念ながら私はそのルートに行かなければなりません。したがって、DogWrapper
はfetch()
メソッドとgetAnimal()
メソッドを持ちます。だからDog
を食べたいなら、dog.getAnimal().eat()
に電話しなければならない。私はそれをやることを避けていましたが、周りには道がないと思います。誰かがそれより簡単な何かを見ますか?
「私は基本的に犬にそれをダウンキャストする必要がある」しかし、それは*ありません* 'Dog'です。非犬に「犬」のように行動するように求めることはできません。ダウンキャスト*はサポートされていますが、安全に実行されます...キャストは、実行時の型が要求された型と互換性がある場合にのみ成功します。 'dog.fetch()'は何をすると思いますか? 'Dog'で宣言されたいくつかのフィールドを使って、実際のオブジェクトにはないものはどうでしょうか? –
だから、あなたは「犬」ではない「動物」をいくつか持っていますが、とにかく「犬」のように扱いたいと思っています。それを自分で「犬」に変換する必要があります。 Javaはこれを行う方法を自ら知ることができません。 (なぜ、これは有用だと思いますか?動物が「犬」でない場合は、「犬」に固有のメソッドを呼び出すとどうなりますか?) – Jesper
if(animal instanceof Dog){dog dog =(Dog)animal} else {//問題の事例を処理する} – mdewit