[解決済み] このJava 8のラムダは、なぜコンパイルに失敗するのでしょうか?
2023-06-09 16:37:27
質問
以下のJavaコードは、コンパイルに失敗します。
@FunctionalInterface
private interface BiConsumer<A, B> {
void accept(A a, B b);
}
private static void takeBiConsumer(BiConsumer<String, String> bc) { }
public static void main(String[] args) {
takeBiConsumer((String s1, String s2) -> new String("hi")); // OK
takeBiConsumer((String s1, String s2) -> "hi"); // Error
}
コンパイラが報告する。
Error:(31, 58) java: incompatible types: bad return type in lambda expression
java.lang.String cannot be converted to void
不思議なのは、"OK" と書かれた行はうまくコンパイルできるのに、"Error" と書かれた行は失敗することです。 これらは本質的に同じように見えます。
どのように解決するのですか?
と一致するラムダである必要があります。
BiConsumer<String, String>
. を参考にすると
JLS #15.27.3 (ラムダの型)
:
ラムダ式は、以下の全てが真であれば、関数型と合同である。
- [...]
- 関数型の結果がvoidの場合、ラムダ本体はステートメント式(§14.8)かvoid互換ブロックのどちらかになります。
つまり、ラムダはステートメント式かvoid互換ブロックのどちらかでなければなりません。
- コンストラクタの呼び出しは ステートメント式 であるため、コンパイルされます。
- 文字列リテラルはステートメント式ではないので、void互換ではありません(cf. の例では、15.27.2 の例を参照)ので、コンパイルされません。
関連
-
CAS 5.1.8でhttpをサポートし、認証されていない認可サービスエラーのプロンプトが表示される問題を解決した。
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] なぜJavaにはtransientフィールドがあるのですか?
-
[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
-
[解決済み】Java 8 lambda Void 引数
-
[解決済み】array[idx++]+="a "は、Java 8ではidxを1回増やすが、Java 9と10では2回増やすのはなぜか?
-
[解決済み】Java 8 Lambda関数が例外を投げる?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NullPointerException - java.lang.
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
強制型変換について
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
java send https request prompt java.security.cert.について。
-
1分でわかる!恋人の写真をIDEAの背景画像に設定する方法【おすすめ集
-
switch case文のcaseの後の列挙定数は列挙型なし
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.