<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### 使用 enum 分發 直接將 RoShamBol.java 翻譯為基于 enum 的版本是有問題的,因為 enum 實例不是類型,不能將 enum 實例作為參數的類型,所以無法重載 eval() 方法。不過,還有很多方式可以實現多路分發,并從 enum 中獲益。 一種方式是使用構造器來初始化每個 enum 實例,并以“一組”結果作為參數。這二者放在一塊,形成了類似查詢表的結構: ```java // enums/RoShamBo2.java // Switching one enum on another // {java enums.RoShamBo2} package enums; import static enums.Outcome.*; public enum RoShamBo2 implements Competitor<RoShamBo2> { PAPER(DRAW, LOSE, WIN), SCISSORS(WIN, DRAW, LOSE), ROCK(LOSE, WIN, DRAW); private Outcome vPAPER, vSCISSORS, vROCK; RoShamBo2(Outcome paper, Outcome scissors, Outcome rock) { this.vPAPER = paper; this.vSCISSORS = scissors; this.vROCK = rock; } @Override public Outcome compete(RoShamBo2 it) { switch(it) { default: case PAPER: return vPAPER; case SCISSORS: return vSCISSORS; case ROCK: return vROCK; } } public static void main(String[] args) { RoShamBo.play(RoShamBo2.class, 20); } } ``` 輸出為: ``` ROCK vs. ROCK: DRAW SCISSORS vs. ROCK: LOSE SCISSORS vs. ROCK: LOSE SCISSORS vs. ROCK: LOSE PAPER vs. SCISSORS: LOSE PAPER vs. PAPER: DRAW PAPER vs. SCISSORS: LOSE ROCK vs. SCISSORS: WIN SCISSORS vs. SCISSORS: DRAW ROCK vs. SCISSORS: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN ROCK vs. PAPER: LOSE ROCK vs. SCISSORS: WIN SCISSORS vs. ROCK: LOSE PAPER vs. SCISSORS: LOSE SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN ``` 在 compete() 方法中,一旦兩種類型都被確定了,那么唯一的操作就是返回結果 Outcome 然而,你可能還需要調用其他的方法,(例如)甚至是調用在構造器中指定的某個命令對象上的方法。 RoShamBo2.javal 之前的例子短小得多,而且更直接,更易于理解。注意,我們仍然是使用兩路分發來判定兩個對象的類型。在 RoShamBol.java 中,兩次分發都是通過實際的方法調用實現,而在這個例子中,只有第一次分發是實際的方法調用。第二個分發使用的是 switch,不過這樣做是安全的,因為 enum 限制了 switch 語句的選擇分支。 在代碼中,enum 被單獨抽取出來,因此它可以應用在其他例子中。首先,Competitor 接口定義了一種類型,該類型的對象可以與另一個 Competitor 相競爭: ```java // enums/Competitor.java // Switching one enum on another package enums; public interface Competitor<T extends Competitor<T>> { Outcome compete(T competitor); } ``` 然后,我們定義兩個 static 方法(static 可以避免顯式地指明參數類型),第一個是 match() 方法,它會為一個 Competitor 對象調用 compete() 方法,并與另一個 Competitor 對象作比較。在這個例子中,我們看到,match()方法的參數需要是 Competitor\<T\> 類型。但是在 play() 方法中,類型參數必須同時是 Enum\<T\> 類型(因為它將在 Enums.random() 中使用)和 Competitor\<T\> 類型(因為它將被傳遞給 match() 方法): ```java // enums/RoShamBo.java // Common tools for RoShamBo examples package enums; import onjava.*; public class RoShamBo { public static <T extends Competitor<T>> void match(T a, T b) { System.out.println( a + " vs. " + b + ": " + a.compete(b)); } public static <T extends Enum<T> & Competitor<T>> void play(Class<T> rsbClass, int size) { for(int i = 0; i < size; i++) match(Enums.random(rsbClass),Enums.random(rsbClass)); } } ``` play() 方法沒有將類型參數 T 作為返回值類型,因此,似乎我們應該在 Class\<T\> 中使用通配符來代替上面的參數聲明。然而,通配符不能擴展多個基類,所以我們必須采用以上的表達式。
                  <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>

                              哎呀哎呀视频在线观看