実現したいこと
『すっきりわかるJava実践編』という書籍にて勉強していたところシールクラスについて記載があり、自分でも試しながら作成していたところ、switch文で子クラスのインスタンスが渡された際の処理を分岐している記述で「defalt句」を使用せずに実現できる方法について記載のあった以下のコードで疑問がありました。
public sealed class Charactor permits Hero,Wizard{} public final class Hero extends Charactor{} public final class Wizard extends Charactor{}
上記継承関係のクラスを作成し
public void heal(Charactor target){ switch(target){ case Hero h ->{h.hp += 20;} case Wizard w -> {w.hp += 5;} } }
というメソッドを作成し分岐させることができ、かつ子クラスはpermitsで指定しているHeroとWizardに限定されるため、default句を使用しなくてもコンパイルエラーは発生しないということだったのですが、自分で試してやってみたところ、コンパイルエラーが発生しました。
発生している問題・分からないこと
コンパイルエラーの原因はswitch文がすべての可能な入力値をカバーしていないというものでしたが、default句もしくは親クラスであるCharactorのインスタンスが渡された際の処理を記述したところエラーは解消しました。
そこで疑問だったのが、書籍では、継承された子クラスのみの分岐処理を記載しシールクラスの有用性を説明しており、便利な機能だなと自分もそれで納得していたのですが、親クラスのインスタンスを渡した際の処理を書かなければならないならば、書籍もそういう記載にしていたはずだと感じまして、自分で勝手に作ったクラス、もしくはhealメソッドの記載場所等にに何か誤りがあるかといろいろやってみたのですが、コンパイルは一向に通らず、このケースではやはり親クラスのインスタンスを渡した際の処理の記述の必要があるのでしょうか。また、子クラスのインスタンスが渡ってきた際の処理の記述のみでOKな方法はあるのでしょうか。
ご教示しただけますと幸いです。
よろしくお願いいたします。
エラーメッセージ
error
1Main.java:20: エラー: switch文がすべての可能な入力値をカバーしていません
該当のソースコード
特になし
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
public
1 public static void main(String[] args) { 2 Animal dog = new Dog(10,"Dog"); 3 Animal cat = new Cat(10,"Cat"); 4 Bird bird = new Bird(10,"Bird"); 5 Animal animal = new Animal(); 6 7 cat.heal(cat); 8 System.out.println(cat); 9 animal.heal(animal); 10 // bird.heal(bird); 11 // System.out.println(bird); 12 13 } 14 15} 16 17sealed class Animal permits Dog,Cat{ 18 public void heal(Animal target){ 19 switch (target) { 20 case Dog d->{d.hp += 20;} 21 case Cat c->{c.hp += 100;} 22 //case Animal a ->{System.out.println("too bad");} 23 } 24 } 25 26} 27 28final class Dog extends Animal{ 29 int hp; 30 String name; 31 public Dog(int hp,String name){ 32 this.hp = hp; 33 this.name = name; 34 } 35 @Override 36 public String toString(){ 37 return this.name+":"+this.hp; 38 } 39} 40final class Cat extends Animal{ 41 int hp; 42 String name; 43 public Cat(int hp,String name){ 44 this.hp = hp; 45 this.name = name; 46 } 47 @Override 48 public String toString(){ 49 return this.name+":"+this.hp; 50 } 51} 52// Animalにpremitsされていないため、Animal継承不可 53final class Bird{ 54 int hp; 55 String name; 56 public Bird(int hp,String name){ 57 this.hp = hp; 58 this.name = name; 59 } 60 61 @Override 62 public String toString(){ 63 return this.name+":"+this.hp; 64 } 65}
補足
特になし
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
![guest](/img/icon/icnUserSample.jpg)
回答1件
あなたの回答
tips
プレビュー