<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 未綁定的方法引用 未綁定的方法引用是指沒有關聯對象的普通(非靜態)方法。 使用未綁定的引用時,我們必須先提供對象: ~~~java // functional/UnboundMethodReference.java // 沒有方法引用的對象 class X { String f() { return "X::f()"; } } interface MakeString { String make(); } interface TransformX { String transform(X x); } public class UnboundMethodReference { public static void main(String[] args) { // MakeString ms = X::f; // [1] TransformX sp = X::f; X x = new X(); System.out.println(sp.transform(x)); // [2] System.out.println(x.f()); // 同等效果 } } ~~~ 輸出結果: ~~~ X::f() X::f() ~~~ 截止目前,我們看到了與對應接口簽名相同的方法引用。 在**\[1\]**,我們嘗試把`X`的`f()`方法引用賦值給**MakeString**。結果即使`make()`與`f()`具有相同的簽名,編譯也會報“invalid method reference”(無效方法引用)錯誤。 這是因為實際上還有另一個隱藏的參數:我們的老朋友`this`。 你不能在沒有`X`對象的前提下調用`f()`。 因此,`X :: f`表示未綁定的方法引用,因為它尚未“綁定”到對象。 要解決這個問題,我們需要一個`X`對象,所以我們的接口實際上需要一個額外的參數,如上例中的**TransformX**。 如果將`X :: f`賦值給**TransformX**,在 Java 中是允許的。我們必須做第二個心理調整——使用未綁定的引用時,函數式方法的簽名(接口中的單個方法)不再與方法引用的簽名完全匹配。 原因是:你需要一個對象來調用方法。 **\[2\]**的結果有點像腦筋急轉彎。我拿到未綁定的方法引用,并且調用它的`transform()`方法,將一個X類的對象傳遞給它,最后使得`x.f()`以某種方式被調用。Java知道它必須拿到第一個參數,該參數實際就是`this`,然后調用方法作用在它之上。 如果你的方法有更多個參數,就以第一個參數接受`this`的模式來處理。 ~~~java // functional/MultiUnbound.java // 未綁定的方法與多參數的結合運用 class This { void two(int i, double d) {} void three(int i, double d, String s) {} void four(int i, double d, String s, char c) {} } interface TwoArgs { void call2(This athis, int i, double d); } interface ThreeArgs { void call3(This athis, int i, double d, String s); } interface FourArgs { void call4( This athis, int i, double d, String s, char c); } public class MultiUnbound { public static void main(String[] args) { TwoArgs twoargs = This::two; ThreeArgs threeargs = This::three; FourArgs fourargs = This::four; This athis = new This(); twoargs.call2(athis, 11, 3.14); threeargs.call3(athis, 11, 3.14, "Three"); fourargs.call4(athis, 11, 3.14, "Four", 'Z'); } } ~~~ 需要指出的是,我將類命名為**This**,并將函數式方法的第一個參數命名為**athis**,但你在生產級代碼中應該使用其他名字,以防止混淆。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看