関数型インターフェースの配列の作り方

このQ&Aのポイント
  • 関数型インターフェースを勉強し始めた者です。関数型インターフェースの配列の作り方について教えてください。
  • プログラムでは、関数型インターフェースの配列を作成しましたが、型の安全性に関する警告が出ています。
  • 警告が解消する方法や、代替案についてご教示いただけますか?
回答を見る
  • ベストアンサー

関数型インターフェースの配列の作り方

関数型インターフェースを勉強し始めた者です。 関数型インターフェースの配列はどのように作ればよいのでしょうか? 関数配列のようなものを作ろうとして以下のプログラムを作りました。 環境:Windows 7 64bit IDE:Eclipse 4.5.2 JDK:1.8 package interfaceSample; import java.util.function.Function; public class FuncSample3 { public static void main(String[] args) { //@SuppressWarnings("unchecked") Function<Integer, Integer>[] funcList = new Function[3]; funcList[0] = FuncSample3::mul; funcList[1] = FuncSample3::add; funcList[2] = FuncSample3::sub; for (Function<Integer, Integer> function : funcList) { funcApply(function, 10); } } public static int mul(int x) { return x * 2; } public static int add(int x) { return x + 2; } public static int sub(int x) { return x - 2; } public static void funcApply(Function<Integer, Integer> func, int t) { System.out.println("この関数の値は"+func.apply(t)); } } このプログラムを打ち込んだところ、期待通りの出力をしてくれたのですが、以下の警告が出てきました。 型の安全性: 型 Function[] の式は、未検査の型変換を使用して Function<Integer,Integer>[] に準拠するようにする必要があります このメッセージでググって見たのですが、インターフェースについてこのメッセージが出たケースに当たりませんでした。 @SuppressWarnings("unchecked")を付ければ警告は消えるのですが、あんまり気分が良くないです。 よろしくお願いいたします。 ※OKWAVEより補足:「Webシステム開発」についての質問です。

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

質問者が選んだベストアンサー

  • ベストアンサー
  • unokwave
  • ベストアンサー率58% (966/1654)
回答No.2

総称配列エラーについては私も理解していませんでしたが、「Java 総称配列」でググって見つかる http://www.ne.jp/asahi/hishidama/home/tech/java/generics.html https://nagise.hatenablog.jp/entry/20180214/1518569217 これらを読むと良いと思います。 結論は、Java言語が作られてきた歴史的経緯が理由で総称型(Generic)に制限があるため、と言うことになります。 そもそもを言えば配列の使用は避けて、List型等を使え、という事ですね。

mental_HELLth
質問者

お礼

返信が遅くなりまして大変申し訳ありませんでした。 総称型にこのような制限があるとは全く知らなかったので、大変参考になりました。 今後このような機会がありましたら(あるのでしょうか?)、Listを使うようにします。 ありがとうございました。

その他の回答 (1)

  • unokwave
  • ベストアンサー率58% (966/1654)
回答No.1

JDK 1.8とは古いですね。 >new Function[3]; そのワーニングの内容そのままですよ。 new Function<Integer,Integer>[3] という具合に、型に依存する引数を省略せずに記述してください。

mental_HELLth
質問者

補足

回答いただきましてありがとうございます! 変更してみたのですが、今度は以下のエラーが発生しました。。。 Function<Integer,Integer> の総称配列を作成できません せっかく回答していただいたのにすみません。。。 JDKが古いのは研修で使っているのがこのバージョンだからです。

関連するQ&A

  • C言語の基本的な質問ですが、関数へのポインタの宣言

    関数へのポインタの質問です。 下のように、関数へのポインタを使ったプログラムを書きました。 (関数へのポインタを理解するためのものなので、実用的な意味はありません。(*^_^*) また、このプログラムはコンパイルもリンクも実行も問題なく出来ます。) #include <stdio.h> int add_func(int,int); (*func_p0) (int,int); int main(void) { int (*func_p1) (int,int); int (*func_p2) ( ); int hoge0,hoge1,hoge2; func_p0=add_func; hoge0=func_p0(3,5); printf("0 : 3+5は%d\n",hoge0); func_p1=add_func; hoge1=func_p1(3,5); printf("1 : 3+5は%d\n",hoge1); func_p2=add_func; hoge2=func_p2(3,5); printf("2 : 3+5は%d\n",hoge2); return(0); } int add_func(int x, int y) { return(x+y); } func_p0のように戻り値の型を書かない場合と、func_p1やfunc_p2のように戻り値の型を書くのとでは何が違うのでしょうか。 func_p0は外部変数ですが、自動変数にする(main関数の中で同様に宣言。)とコンパイルエラーになります。 それはなぜですか。 func_p1のように引数の型が書いてあるのと、func_p2のように引数の型が書いていないのでは何が違うのでしょうか。 int (*func_p2) ( );というのは、int (*func_p2) (void);とは違うんですよね?

  • 構造体の配列を関数に渡すには

    構造体の配列を関数の引数として渡そうとすると エラーになってしまいます ネットで調べてもいまいちわからなかったので ここで質問させてもらいます #include<stdio.h> struct A{   ・    ・    ・ }; void func(struct A *p); int main(void) { struct A x[3][4] = {     ・     ・     ・ }; func(x); return 0; } void func(struct A *p){     ・     ・    ・ } どうすれば渡すことができるのでしょうか? どなたか助言お願いします。

  • 二つ以上の値を返す関数

    たとえば、a,bという値を関数に入れて、関数の中で変わったa,bを受け取るような方法はないでしょうか。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=138798 の int main(void) { int a=1, b=2; func(&a, &b); printf("%d, %d\n", a, b); return 0; } void func(int *x, int *y) { *x++; *y++; } を実行してみましたが、 「関数 'func' は定義されていません。int 型の値を返す外部関数と見なします。」 と出てきました。 助言をよろしくお願いします。

  • fortran90 引数で渡された関数の呼び出し

    fortran90を始めて間もない者です。 メインプログラムより呼び出しているサブルーチンにユーザ関数を渡しています。 このサブルーチンを自前で作成するのが目的です。 引数で受け取った関数を、自前の別関数より呼び出すにはどうしたら良いでしょうか。 Cであれば関数のポインタをグローバルな変数にセットしてやれば可能だと思いますが・・・ !-------------------------------- subroutine sub(func1, a) real::a interface real function func1(x) real::x end function func1 real function func2(x) real x end function func2 end interface call sub2(func2, a) write(*,*) a return end subroutine sub !-------------------------------- real function func2(x) real::func2, x ! ここでfunc1を呼び出したい ! func2=func1(x) end function func2 !-------------------------------- subroutine sub2(funca, a) real::a interface real function funca(x) real::x end function funca end interface a=funca(10.) return end !-------------------------------- program main external func real a call sub(func, a) write(*,*) a end program !-------------------------------- function func(x) real func, x func=2.*x*x end function func

  • C言語で、他の関数で配列を書き換えられないようにしたい

    下のCのプログラムでは、func関数は配列aの先頭要素へのポインタを返します。 main関数の側では配列aの中身を表示します。 しかし、main関数のfor文の中の★の部分をコメントアウトせずに入れると、この配列の中身が書き換わってしまいます。  私はfunc関数以外では、この配列の中身をいじられたくないのです。  なんとかfunc関数を工夫して作成して、func関数以外では、配列の中身が変わらないようにしたいのですが、どうすればよいでしょうか。    とは言ったものの、多分できないだろうなあ、という気がします。  できないならばできないでも仕方ないのですが、確信が持てないのです。 条件があります。 funcでは表示は行なわない。 配列aの中身を表示できるように、funcから呼び出し元へ、aのアドレスまたはaの先頭要素のアドレスがわかるような情報を返す。 #include <stdio.h> char *func(int i) { static char a[]="AAAA"; a[i]='z'; return a; } int main(void) { int i; for(i=0; i<4; i++) { char *p=func(i); /* p[i]='X'; ★配列の中身を書き換えてしまう。 */ puts(p); } return 0; }

  • 関数原型宣言について

    関数原型宣言について 下記のプログラムのfunc関数は、関数原型宣言 <func(int a, long b, char *c);>が述されていないのにfunc関数の仮引数の型longは、関数原型宣言が与えられるといると本に書かれていたのですが、何故でしょうか教えて頂きたい。 ******************************************** #include <stdio.h> /*--- 三つの引数を受け取る関数 ---*/ void func(int a, long b, char *c) { int x; long y; /* … */ } int main(int argc, char *argv[]) { int a = 1; char s[] = "abc"; func(a + 3, 2, s); return (0); } *************************************************************

  • Cygwinでg++がグローバル関数をはじいてしまう

    現在Win XP上にGygwinを導入し C++の勉強をしています。 書籍を購入し、以下のプログラムを試したところ グローバル関数宣言をしているにもかかわらず main() とfunc1()中で変数”count”が undeclared (first use this function) として弾かれてしまいます。 どうしてなのでしょうか? よろしくお願いします。 //example global variavle. #include<iostream> using namespace std; void func1(); void func2(); static int count; //This is global variavle. int main() { int i; //This is local variavle. for(i=0; i<10 ; i++){ count = i * 2; func1(); //calling func1(). } return 0; } void func1() { cout << "count: " << count; //access global "count" cout << "\n"; func2(); //calling func2(). } void func2() { int count; //define local "count" for(count=0;count<3;count++) { cout << "."; } }

  • signal関数の使い方

    標準関数のsignal()関数についてですが void (*signal(int sig, void (*func)(int)))(int); 関数の形式からしてよくわかりません。 僕のイメージでは関数のポインタというと void (*func)(int,int) という感じですが上の場合 void (*func(int,int))(int) /*引数は仮にint型*/ という形式になってますよね。末尾の(int)は引数のはずですがどこの引数になっているのかよくわかりません。 しかも関数の使用例などをみると signal(SIGINT, func); という形で使っており末尾の(int)がどこにいったのかさっぱりわかりません。 よろしくお願いします。

  • 関数ポインタについて

    C言語の関数ポインタの問題で以下のような問題で、実際に解いて、プログラムを動かしてみてみました。 正常に動作したのですが、この回答では満点はもらえませんでした。 このほかに良い解答例などありましたら、教えていただけないでしょうか。 どうかよろしくお願い致します。 [問題]次の※1・※2を埋めなさい(「func1」,「func2」は解答に含まれないように書くこと)。 #include <stdio.h> void func1() { printf("func1\n"); } void func2() { printf("func2\n"); } void func(int no) { void (*func[2])(void) = {func1, func2}; /* ※1 (*func[no])() */; } int main() { /* ※2 func(1) */; return 0; } 実行結果:func2

  • Java 戻りの型が2つあるメソッド

    @SuppressWarnings("unchecked") public static <E> E get(List<E> list, int offset) { E array = (E) list.toArray(); return array[offset]; } なんでpublic static E get(List<E> list, int offset)じゃだめなんですか?

専門家に質問してみよう