• 締切済み

インターフェースを持つenum定数を引数にする方法

jdk5を利用しています。 特定のIFを持つenum定数が、複数あります。 例.IHogeをもつenum定数 public enum Hoge implements IHoge { HOGE1(1),HOGE2(2),HOGE3(3); private int no = 0; private Hoge(int no) {this.no = no;} /* IFのMethod */ public int getNo(){return no ;} } enum定数を使用して、下のような処理を行っています。 class A { public void a(){ this.c.setClass(Hoge); for(IHoge iHoge : Hoge.values()) { this.setHogeX(iHoge.getNo()); } } public void b(){ //別のenum定数の処理 } } 現在、enum定数毎に、別々のメソッドを用意して対応していますが、 処理が、全く同じな為、一つのメソッドにしたいと思っています。 IFを持つenum定数を、引数にしたいのですが、どのように記述すればよいか分りません。 public void a(Class<? extends Enum> hoge) {} 上の宣言だと、enum定数は通りますが、IFは渡せません。 本などを調べましたが、見つける事が出来ませんでした。 ご存知の方、ご教授よろしくお願いいたします。

  • Java
  • 回答数2
  • ありがとう数0

みんなの回答

noname#199419
noname#199419
回答No.2

Enumを調べてる途中だったのでいろいろやってみました。 Class<? extends Enum>で試したら 中身なくなってClass型で実行されるみたいですね。 values()で中身を全部出して実行して見ました。 implementsがない場合はEnumで渡してMethodUtils.invokeMethodとか で直接指定したら実行できるみたいですね。 System.out.println(MethodUtils.invokeMethod(fruit,"getLang",null)); 以下、一様動きますJDK6だけど。 public class EnumExec { public interface Fruit { public String getLang(); } public enum FruitEn implements Fruit { Banana("Banana") , Apple("Apple") , Lemon("Lemon") , Orange("Orange") , Peach("Peach"); // メンバ変数の定義 private String name; // コンストラクタの実装 private FruitEn (String name) { this.name = name; } public String getLang() { return name + "(en)"; } } public enum FruitJa implements Fruit { Banana("バナナ") , Apple("りんご") , Lemon("レモン") , Orange("オレンジ") , Peach("ピーチ"); // メンバ変数の定義 private String name; // コンストラクタの実装 private FruitJa (String name) { this.name = name; } public String getLang() { return name + "(ja)"; } } public void execute(Fruit[] fruits) { for (Fruit fruit : fruits ) { System.out.println(fruit.getLang()); } } /** * * @param args */ @SuppressWarnings("unchecked") public static void main(String[] args) { EnumExec lang = new EnumExec(); lang.execute(FruitJa.values()); lang.execute(FruitEn.values()); } }

回答No.1

ちょっと質問の意味が読み取りづらいのですが、ご参考までに。 >public void a(Class<? extends Enum> hoge) {} >上の宣言だと、enum定数は通りますが 通らないはずですが……? >IFを持つenum定数を、引数にしたいのですが、どのように記述すればよいか分りません。 この一文から察する限りでは、もしかしたらお望みのものは単純に public void a(IHoge hoge) {} のような気がしないこともありません。コードの断片を示して頂いておいてなんですが、もう少し具体的な処理を示すと自分のエスパー能力をもちっと発揮できるような気もします。 ちなみに、"IF"とは制御構文の「if文」ではなく、インターフェイスのことでよろしいでしょうか?インターフェイスを"IF"と略すのは初めて見ました。

関連するQ&A

  • enumをintとして扱う必要があるパターンはあるのでしょうか。

    enumをintとして扱う必要があるパターンはあるのでしょうか。 よく enum ENUM_SAMPLE {  A,  B,  C, }; class CLASS_SAMPLE { private:  int type; // ENUM_SAMPLEのA,B,Cしか入らない public:  int GetType(){ return type; } }; という記述を良く見かけます。 class CLASS_SAMPLE { private:  ENUM_SAMPLE type; // ENUM_SAMPLEのA,B,Cしか入らない public:  ENUM_SAMPLE GetType(){ return type; } }; のほうが良いのではないか思うのですが、intで定義することによる利点が何かあるのでしょうか。 あと、過去に // bcc利用時に問題があるのでintに変更しました int CLASS_SAMPLE::GetType {  return type; } というコメントがついたソースを見たことがあり、 自分でbccを使ってenumを返すように修正してテストしてみたことがあるのですが、何が問題なのか見つけることが出来ませんでした。 enum名を直接使用した場合に問題が発生することがあるのか、またどのような問題が発生することがあるのか、回答お願いします。

  • HQLについて分らない

    ところがあります。 Entityを以下の様に定義したとします。 public class Member implements Serializable { private Integer no; private String name; public Integer getNo(){return this.no;} public void setNo(Integer no){this.no = no;} public Member(){} public String getName(){return this.name;} public void setName(String name){this.name = name;} } その場合にHQLにおいて Query findquery=session.createQuery("select m from Member m where m.no= :no"); findquery.setInteger( "no", no.intValue() ); というように書くことが出きるのでしょうか? noはintでなくIntegerなのに m.no= :no などと記してよいのでしょうか?(Integer=intになっている) それともHQLを使うためには Entityでnoの型をIntegerでなくintにしなければならないのでしょうか?

    • ベストアンサー
    • Java
  • JAVAでの定数追加

    定数1~定数100が定義されておりクラス(メソッド)内に定数を使用したif文が複数存在するとします。 ※if文の条件は定数(文字列)のstartWithによる比較 定数101を追加する場合に定数定義+if文の条件を追加しなければならないのですが、 定数定義のみで対応できるようにするにはどうすればよいでしょうか? 以下を考えてみましたが(不可もありますが・・・)もっと良い方法はありますでしょうか? 案1)×   Mapを使用。getする際にstartWithであるためできないことが判明。(equalsの比較なら可能)   private final static Map map = new HashMap(){    put("a1","");    put("a2","");       :    put("a101","");   } 案2)△  ArrayListを使用。   private final static List list = new ArrayList(){    add("a1");      :    add("a101");   }  メソッド内でfor文を使用するため性能的に落ちる?  for(int i=0;i<list.size();i++){   String str = "aaa";   if(list.get(i).startWith(aaa){     処理; } } 案3)正規表現で実施。定数値がさまざまなため断念。 例) private final static String a1 = "a1"; private final static String a2 = "a2";        : private final static String a100 = "a2"; public void methodA(){  String str = "aaa";  if(a1.startWith(str) || a2.startWith(str) || ・・・ a100.startWith(str)){   処理;  }   : } public void methodB(){  String str = "aaa";  if(a1.startWith(str) || a2.startWith(str) || ・・・ a30.startWith(str)){   処理;  }   : }

    • ベストアンサー
    • Java
  • static methodの引数thisについて

    javaの『static メソッド』の中では、thisが使用できないようです(再質問)。 毎度、お世話になります。 出来れば、下記のコードでthisの部分の変更をお教え頂けないでしょうか? 尚、この場合のthisは、myclsFFTクラスの中の、Thread(this)の引数と なっています(下記のコード参照)。 Q1) このthisに代わる記述、方法はありますか? static void start_threadFFT(int sw_curve){ ..... new Thread(this).start(); .... } 以上、宜しくお願い申し上げます。 ========================================== public class myclsFFT extends myDrawClass implements Runnable{ myclsFFT(){ } static void start_threadFFT(int sw_curve){ ..... new Thread(this).start(); .... } ...... } ==========================================

    • ベストアンサー
    • Java
  • アノテーションを利用したアクセサメソッドの自動定義というのは実現可能?

    近年、デフォルトコンストラクタと各フィールドに対するアクセサメソッド(setter/getter)を備えたJavaBeansが話題になっていると思います。例えばこんなクラス。 class TestBeans {  private int number;  public void setNumber(int number) {   this.number = number;  }  public int getNumber() {   return number;  } } しかし、フィールドの数が増えてくると、コードがどんどん冗長になってくると思います。 そこで、ふと思ったのですが、リフレクションとJDK5のアノテーションを使って、下記のようにスッキリとアクセサメソッドが利用できるようになったりしないかなぁ、と。 class TestBeans {  @Getter @Setter  private int number; } こうすることによって、getNumber / setNumber が利用できるようになったりしないかな、ということです。 アノテーションの自作やリフレクションに関する知識が乏しいので、私にはよくわかりませんでした。 こういったことは実現可能なのでしょうか? また可能ならばどのように実装するのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Java
  • インターフェイス(独習JAVAのP234課題1について)

    インターフェイスの参照のコーディングについて質問です interface Locomotion{ void stop(); } interface Sound{ void beep(); } abstract class Robot{ } class RobotA extends Robot{ } class RobotA1 extends RobotA implements Sound{ public void beep(){ System.out.println("RobotA1: beep"); } } class RobotB extends Robot implements Locomotion{ public void stop(){ System.out.println("RobotB: stop"); } } class RobotC extends Robot implements Locomotion,Sound{ public void stop(){ System.out.println("RobotC: stop"); } public void beep(){ System.out.println("RobotC: beep"); } } class RobotType{ private final static int NUM = 4; public static void main(String args[]){ Robot robots[] = new Robots[NUM];     Robot robots[0] = new RobotA(); Robot robots[1] = new RobotA1(); Robot robots[2] = new RobotB(); Robot robots[3] = new RobotC(); //Soundインターフェイスを実装しているメソッドの呼び出し for(int i=0;i<NUM;i++){ if(robots[i] instanceof Sound){ Sound sound = (Sound)robots[i]; sound.beep(); } } for(int i=0;i<NUM;i++){ if(robots[i] instanceof Locomotion){ Locomotion locomotion = (Locomotion)robots[i]; locomotion.stop(); } } } } main処理でSoundインターフェイス等を参照する時に、 なぜ、Sound sound = (Sound)robots[i];の用に記述しないと駄目なのでしょうか? robots[i].beep();で参照できると思ったのですが、コンパイルエラーになってしまいます アドバイスよろしくお願い致します

  • リフレクション 可変長引数メソッドの取得

    リフレクションで、(1)の方のメソッドインスタンスを得たいとき、どういった方法が考えられますか? //JDK 6.0 public Hoge { void method1(String str, Object ...objs){}//(1) void method1(String str, String str2){}//(2) } Hoge hoge = new Hoge(); Class c = hoge.getClass(); Method m12 = c.getMethod("method", String.class, String.class); Method m11 = c.getMethod("method", ?? );

    • ベストアンサー
    • Java
  • テンプレート引数の型推測

    コンパイラはVC++2008です。 いろいろあって、あるクラスにおいて関数ポインタと関数オブジェクト双方を 同じように利用できないかと考えて、次のように試みました。 class Base { public:     virtual void func() =0; }; template<class Func> class CFunc :public Base { private:     Func m_func; public:     CThreadFunc(Func func):m_func(func){}     void func(){m_func();} }; class Hoge { private:     Base* base; public:     template<class Func>     Hoge(Func func)       :base(new CFunc<Func>(func))     {}     ~Hoge()     {       delete base;     }     void DoSomething()     {       base->func();     } }; クラスをテンプレートにするといちいち指定しなければならないので、 まず基底クラスに適当な仮想関数を設け、それを継承したクラスをテンプレートにしました。 そしてコンストラクタの引数で何かしらを受け取って、オーバーライドした関数の中で 関数ポインタか関数オブジェクトだと仮定して呼び出しています。 さらに基底クラスのポインタを目的のクラスが保持してやり、 こちらはコンストラクタをテンプレートにすることで引数から型を推測してもらうことで 先ほどのテンプレートクラスのインスタンスを作成しています。 そしてポインタを介してfunc()を使ったり…、などすれば、 とりあえず引数なしの関数と関数オブジェクトを同等に扱えないかなと思ったからです。 で、このようなクラスを作成してコンパイルすると、 void func(); //何かしら処理する関数 class Function { public:   void operator ()();  //何かしら処理する関数オブジェクト }; があったとして、 int main() {   Function function;   Hoge hoge(function); //いったん作ってから渡す   Hoge hoge2(func); //関数を渡す     hoge.DoSomething();   hoge2.DoSomething();    } は動きました。しかし、 int main() {   Hoge hoge(Function()); //引数を初期化する } とすると次のようなエラーが出ます。 warning C4930: 'Hoge hoge(Function(__cdecl *)(void))': プロトタイプされている関数が呼び出されませんでした (変数の定義が意図されていますか?) また、 int main() {   Hoge hoge(Function()); //引数を初期化する   hoge.DoSomething();  //クラスにアクセス } とすると次のようなほかのエラーが出ます。 error C2228: '.DoSomething' の左側はクラス、構造体、共用体でなければなりません。 しかし、例えば関数オブジェクトのコンストラクタに引数が設定されていたとして、 class Function { public:   Function(int dummy);  //何か値を受け取る   void operator ()();  //何かしら処理する関数オブジェクト }; となっていた時、 int main() {   Hoge hoge(Function(1)); //引数を初期化する   hoge.DoSomething();  //クラスにアクセス } の呼び出しは正常にコンパイルされ、想定通りの動きをします。 全く使わなくても、一つ以上の適当な引数を何でもいいからコンストラクタが持てば、 普通にコンパイルされるみたいです。ただ、デフォルト引数を与えてHoge hoge(Function())と 同じ形ですと引数があってもできないみたいです。 まったく通らないなら最初からあきらめるですが、中途半端にちゃんと動くために エラーの原因を知りたいと思っています。 テンプレートの場合には、引数に渡すタイミングで初期化はしてはいけないのでしょうか?

  • インタフェースについて教えてください。

    インタフェースについて。 人間と犬を生成し、実行例のように動作するプログラムです。 (1)から(15)の後が解答欄です。 例:(2)の場合implementsが解答欄(空欄) コンパイルができなかったのでどこの解答が間違っているか教えてください。 エラー詳細↓ Behave.java:6: エラー: シンボルを見つけられません h1.play(h1.behaviortype.Walking); ^ シンボル: メソッド play(Behaviortype) 場所: タイプHumanの変数 h1 Behave.java:7: エラー: シンボルを見つけられません d1.play(d1.behaviortype.Walking); ^ シンボル: メソッド play(Behaviortype) 場所: タイプDogの変数 d1 Behave.java:8: エラー: シンボルを見つけられません h1.play(h1.behaviortype.Talking); ^ シンボル: メソッド play(Behaviortype) 場所: タイプHumanの変数 h1 Behave.java:9: エラー: シンボルを見つけられません d1.play(d1.behaviortype.Barking); ^ シンボル: メソッド play(Behaviortype) 場所: タイプDogの変数 d1 エラー4個 【Behave】 class Behave{ public static void main(String[] args){ Human h1 = new Human("人間1"); Dog d1 = new Dog("犬1"); h1.play(h1.behaviortype.Walking); d1.play(d1.behaviortype.Walking); h1.play(h1.behaviortype.Talking); d1.play(d1.behaviortype.Barking); } } 【Animal】 abstract class Animal{ String name; Behaviortype behaviortype; enum Behaviortype{ Walking, Talking, Barking } abstract public void behave(Behaviortype bt); } 【Human】 class Human (1)extends Animal (2)implements Walker, Talker{ public Human(String n){ this.name = n; } @Override public void behave(Behaviortype bt){ switch(bt){ case Walking: (3)walk(); break; case Talking: (4)talk(); break; } } @Override public void (5)walk(){ System.out.println(this.name+"が歩きます。"); } @Override public void (6)talk(){ System.out.println(this.name+"が話します。"); } } 【Walker】 (7)interface Walker{ void walk(); } 【Talker】 (8)interface Talker{ void talk(); } 【Barker】 (9)interface Barker{ void bark(); } 【Dog】 class Dog (10)extends Animal (11)implements Walker, Barker{ public Dog(String n){ this.name = n; } @Override public void behave(Behaviortype bt){ switch(bt){ case Walking: (12)walk(); break; case Barking: (13)bark(); break; } } @Override public void (14)walk(){ System.out.println(this.name+"が歩きます。"); } @Override public void (15)bark(){ System.out.println(this.name+"が吠えます。"); } } 【実行例】java Behave 人間1が歩きます。 犬1が歩きます。 人間1が話します。 犬1が吠えます。

    • ベストアンサー
    • Java
  • Javaについて

    Javaについての質問です。 下記のプログラムは Abst_Class show1 can be inheritted to a subclass num1=1 Class1 show2 is created in Class1 num1=1 num2=2 Class2 show1 is inheritted and overridden in Class2 num1=10 str=SSSSSS Class2 show2 is created in Class2 num1=10 str=SSSSSS と出力するプログラムなのですがエラーが出て出力できません。どこがいけないのか教えていただけないでしょうか? お願いいたします。 interface itr{ itr(){} void show(); void dai(); } abstract abr implements itr{ abr(){ int num1; num1=1; } public void dai(){ if(num1==0){ num1=1; } } public void show(){ dai(); System.out.println("Abst_Class show1 can be inheritted to a subclass num1="+num1); } abstract show1(); } class Class1 extends abr{ int num2; Class1(int a,int b){ num1=a; num2=b; } public void show1(){ super.show(); } void show2(){ super.show(); System.out.println("Class1 show2 is created in Class1 num1="+num1+"num2="+num2); } } class Class2 extends abr{ String str; Class2(int num,String str){ this.str=str; num1=num; } public void show1(){ System.out.println("Class2 show1 is inheritted and overridden in Class2 num1="+num1+"str="+str); } void show2(){ System.out.println("Class2 show1 is inheritted and overridden in Class2 num1="+num+"str="+str); } } class K10_6{ public static void main(String args[]){ Class1 f1 = new Class1(1, 2); Class2 f2 = new Class2(10,"SSSSSS"); f1.show1(); f1.show2(); f2.show1(); f2.show2(); } } .\abr.java:1: class、interface、または enum がありません。 abstract abr implements itr{ ^ .\abr.java:4: class、interface、または enum がありません。 num1=1; ^ .\abr.java:5: class、interface、または enum がありません。 } ^ .\abr.java:6: class、interface、または enum がありません。 public void dai(){ ^ .\abr.java:9: class、interface、または enum がありません。 } ^ .\abr.java:11: class、interface、または enum がありません。 public void show(){ ^ .\abr.java:13: class、interface、または enum がありません。 System.out.println("Abst_Class show1 can be inheritted to a subclass num1="+num1 ); ^ .\abr.java:14: class、interface、または enum がありません。 } ^ .\abr.java:15: class、interface、または enum がありません。 abstract show1(); ^ .\abr.java:16: class、interface、または enum がありません。 }

    • ベストアンサー
    • Java