Java 8 インスタンス メソッド参照はラムダ呼び出しと同等ですか? 私の場合はそうではありません

フォクシーボア

メソッド参照の非常に奇妙な動作を観察します。Web アプリとサーブレット階層のチェーンがあります。サーブレット A が拡張する サーブレット B が拡張するHttpServlet(これが必要な理由は見落としておきましょう)。

Web アプリは Tomcat/Java 8 (web.xml version="3.1" metadata-complete="true") でホストされています。私のローカル ラップトップ (Tomcat 8.0.35 または 8.5.15、Java 8 Update 131、OSX) では、このようなサーブレット コードのスタック オーバーフローが観察されます。

public class A extends B {
    @Override
    protected void service(HttpServletRequest pRequest, HttpServletResponse pResponse) throws ServletException, IOException {
        ServletCommon.servletServiceWrapper(pRequest, pResponse, super::service);
    }
}

スタック オーバーフロー (以下を参照) は非常に疑わしいように見えます。階層にクラス B がまったく含まれていませんクラス A はHttpServlet直接呼び出します (なぜ!? そして、どのようにこれが可能になるのか!!!????)。

同時に、ラムダを使用したコードは正常に機能します。

public class A extends B {
    @Override
    protected void service(HttpServletRequest pRequest, HttpServletResponse pResponse) throws ServletException, IOException {
        ServletCommon.servletServiceWrapper(pRequest, pResponse, (t, u) -> super.service(t, u));
    }
}

ラッパーには、非常に単純なコードも含まれています。

public class ServletCommon {
    @FunctionalInterface
    public interface MyBiConsumer<T, U>{
        void accept(T t, U u) throws ServletException, IOException ;
    }
public static void servletServiceWrapper(HttpServletRequest request, HttpServletResponse response,
        MyBiConsumer<HttpServletRequest, HttpServletResponse> pDelegate) throws ServletException, IOException {
        pDelegate.accept(request, response);
    }
}

スタックトレース

java.lang.StackOverflowError
    ServletA.lambda$service$0(ServletA.java:19)
    ServletCommon.servletServiceWrapper(ServletCommon.java:31)
    ServletA.service(ServletA.java:19)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    ServletA.lambda$service$0(ServletA.java:19)
    ServletCommon.servletServiceWrapper(ServletCommon.java:31)
    ServletA.service(ServletA.java:19)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    ...

何か案は?

かやまん

そうですね

間違ったservice()メソッド (ServletRequest保護されメソッドではなく で公開されているメソッド)をどうにか呼び出しようとしているためHttpServletRequest、無限ループが発生します。ただし、あなたのコード例は、それが起こっている理由を示すのに十分明確ではありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

MethodHandlesを使用して、Java 8でインターフェイスを実装するクラスのメソッドを呼び出す方法は?

分類Dev

インスタンスメソッドへの参照はJava8でシリアル化できますか?

分類Dev

Java8:クラスメソッド参照からインスタンスメソッド参照を取得する方法はありますか?

分類Dev

Java 8のインスタンスメソッド参照型の違いは何ですか?

分類Dev

Java 8では、現在のクラスが実装しているインターフェイスの静的メソッドを呼び出せないのはなぜですか

分類Dev

Java8でインスタンスメソッドへの参照を渡す

分類Dev

静的メソッドとインスタンスメソッドのJava 8参照

分類Dev

Java 8ラムダは内部クラス、メソッド、またはその他の何かとしてコンパイルされていますか?

分類Dev

Javaで別のクラスのメインメソッドを呼び出して、呼び出し元のコードに戻ることは可能ですか?

分類Dev

Javaでラムダ式として、フルコンストラクタ呼び出しとメソッドの参照

分類Dev

インスタンスでメソッドを呼び出すときにクラスのインポートが不要なのはなぜですか(Java)

分類Dev

Javaの8では、なぜ私たちは数学にMath.random()を変換することはできません::ランダムなメソッド参照を使用して

分類Dev

Javaのコンストラクターでメソッドを呼び出すことはできますか?

分類Dev

Java 8:マップを使用してストリーム内のインスタンス メソッド参照を作成できますか?

分類Dev

Java 8はメソッド参照のためにオンザフライでインターフェースを実装できますか?

分類Dev

Java8ラムダは匿名クラスのようにそれらを囲むインスタンスへの参照を維持しますか?

分類Dev

Java8 Javascript Nashorn例外:nashornの現在のグローバルインスタンスはありません

分類Dev

cobertura mavenプラグインはインターフェイスのjava8デフォルトメソッド宣言で機能しませんか?

分類Dev

Java8-ダブルコロン構文を使用してインターフェイスのデフォルトメソッドを呼び出す

分類Dev

非静的メソッドは、Java 8つのストリームの静的コンテキストから参照することができません

分類Dev

Java 8インターフェースのデフォルトメソッドの戻り値の型が明確ではありません

分類Dev

Java 8ストリーム、なぜこれがパート2をコンパイルするのか...または、メソッド参照とは何ですか?

分類Dev

インスタンスフィールドとメソッドにアクセスするJava 8ラムダはデシリアライズできません

分類Dev

Java> = 8は、instanceof instanceを持つ静的コンテキストのインターフェースでデフォルトメソッドを呼び出しますか?

分類Dev

JEXLでそのクラスのインスタンスを作成せずにJavaクラスの静的メソッドを呼び出す方法は?

分類Dev

Javaで他のクラスからメソッドを呼び出すことはできません

分類Dev

コンパイルテストライブラリは、インターフェイスの静的メソッドをコンパイルしません(Java 8)

分類Dev

Java8でオプションのパラメータを使用してメソッドを呼び出す

分類Dev

各呼び出しメソッドとaddAllのJava 8ラムダ

Related 関連記事

  1. 1

    MethodHandlesを使用して、Java 8でインターフェイスを実装するクラスのメソッドを呼び出す方法は?

  2. 2

    インスタンスメソッドへの参照はJava8でシリアル化できますか?

  3. 3

    Java8:クラスメソッド参照からインスタンスメソッド参照を取得する方法はありますか?

  4. 4

    Java 8のインスタンスメソッド参照型の違いは何ですか?

  5. 5

    Java 8では、現在のクラスが実装しているインターフェイスの静的メソッドを呼び出せないのはなぜですか

  6. 6

    Java8でインスタンスメソッドへの参照を渡す

  7. 7

    静的メソッドとインスタンスメソッドのJava 8参照

  8. 8

    Java 8ラムダは内部クラス、メソッド、またはその他の何かとしてコンパイルされていますか?

  9. 9

    Javaで別のクラスのメインメソッドを呼び出して、呼び出し元のコードに戻ることは可能ですか?

  10. 10

    Javaでラムダ式として、フルコンストラクタ呼び出しとメソッドの参照

  11. 11

    インスタンスでメソッドを呼び出すときにクラスのインポートが不要なのはなぜですか(Java)

  12. 12

    Javaの8では、なぜ私たちは数学にMath.random()を変換することはできません::ランダムなメソッド参照を使用して

  13. 13

    Javaのコンストラクターでメソッドを呼び出すことはできますか?

  14. 14

    Java 8:マップを使用してストリーム内のインスタンス メソッド参照を作成できますか?

  15. 15

    Java 8はメソッド参照のためにオンザフライでインターフェースを実装できますか?

  16. 16

    Java8ラムダは匿名クラスのようにそれらを囲むインスタンスへの参照を維持しますか?

  17. 17

    Java8 Javascript Nashorn例外:nashornの現在のグローバルインスタンスはありません

  18. 18

    cobertura mavenプラグインはインターフェイスのjava8デフォルトメソッド宣言で機能しませんか?

  19. 19

    Java8-ダブルコロン構文を使用してインターフェイスのデフォルトメソッドを呼び出す

  20. 20

    非静的メソッドは、Java 8つのストリームの静的コンテキストから参照することができません

  21. 21

    Java 8インターフェースのデフォルトメソッドの戻り値の型が明確ではありません

  22. 22

    Java 8ストリーム、なぜこれがパート2をコンパイルするのか...または、メソッド参照とは何ですか?

  23. 23

    インスタンスフィールドとメソッドにアクセスするJava 8ラムダはデシリアライズできません

  24. 24

    Java> = 8は、instanceof instanceを持つ静的コンテキストのインターフェースでデフォルトメソッドを呼び出しますか?

  25. 25

    JEXLでそのクラスのインスタンスを作成せずにJavaクラスの静的メソッドを呼び出す方法は?

  26. 26

    Javaで他のクラスからメソッドを呼び出すことはできません

  27. 27

    コンパイルテストライブラリは、インターフェイスの静的メソッドをコンパイルしません(Java 8)

  28. 28

    Java8でオプションのパラメータを使用してメソッドを呼び出す

  29. 29

    各呼び出しメソッドとaddAllのJava 8ラムダ

ホットタグ

アーカイブ