[Java]境界ワイルドカード型を使ってジェネリックスメソッドを定義する

書式
1.private static <T> List<? super T> 関数w名(List<? super T> 変数1,
List<? extends T> 変数2,
List<? extends T> 変数3)
2.リストの定義
Integer型
List<Integer> intLst = new ArrayList<Integer>();
Double型
List<Double> dbLst = new ArrayList<Double>()
Number型
List<Number> nbLst = new ArrayList<Number>();

使用例

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
package com.arkgame.demo;
import java.util.ArrayList;
import java.util.List;
public class ListConatDemo {
// Integer型リスト
protected static List<Integer> intLst = new ArrayList<Integer>();
// Double型リスト
protected static List<Double> dbLst = new ArrayList<Double>();
@SuppressWarnings("unchecked")
public static void main(String[] args) {
//Integer型リストに要素を追加
intLst.add(123);
intLst.add(456);
//Double型リストに要素を追加
dbLst.add(77.88);
dbLst.add(99.00);
// 連結結果Number型リスト
List<Number> nbLst = new ArrayList<Number>();
// 境界ワイルドカード型 パラメータ intLst dbLst
nbLst = (List<Number>) testFunc(nbLst, intLst, dbLst);
// リストの要素を出力
for (Number nb : nbLst) {
System.out.print(nb + " ");
}
}
/**
* ジェネリックスメソッドを使ってリストを連結する関数
* 下限境界ワイルドカード型(super) resC
* 上限境界ワイルドカード型(extends)
* @param <T>
* @param resC
* @param cftA
* @param cftB
* @return
*/
private static <T> List<? super T> testFunc(List<? super T> resC,
List<? extends T> cftA,
List<? extends T> cftB) {
// リストresCの最後にリストAを追加
resC.addAll(cftA);
// リストresCの最後にリストBを追加
resC.addAll(cftB);
return resC;
}
}
package com.arkgame.demo; import java.util.ArrayList; import java.util.List; public class ListConatDemo { // Integer型リスト protected static List<Integer> intLst = new ArrayList<Integer>(); // Double型リスト protected static List<Double> dbLst = new ArrayList<Double>(); @SuppressWarnings("unchecked") public static void main(String[] args) { //Integer型リストに要素を追加 intLst.add(123); intLst.add(456); //Double型リストに要素を追加 dbLst.add(77.88); dbLst.add(99.00); // 連結結果Number型リスト List<Number> nbLst = new ArrayList<Number>(); // 境界ワイルドカード型 パラメータ intLst dbLst nbLst = (List<Number>) testFunc(nbLst, intLst, dbLst); // リストの要素を出力 for (Number nb : nbLst) { System.out.print(nb + " "); } } /** * ジェネリックスメソッドを使ってリストを連結する関数 * 下限境界ワイルドカード型(super) resC * 上限境界ワイルドカード型(extends) * @param <T> * @param resC * @param cftA * @param cftB * @return */ private static <T> List<? super T> testFunc(List<? super T> resC, List<? extends T> cftA, List<? extends T> cftB) { // リストresCの最後にリストAを追加 resC.addAll(cftA); // リストresCの最後にリストBを追加 resC.addAll(cftB); return resC; } }
package com.arkgame.demo;

import java.util.ArrayList;
import java.util.List;

public class ListConatDemo {

      // Integer型リスト
      protected static List<Integer> intLst = new ArrayList<Integer>();
      
      // Double型リスト
      protected static List<Double> dbLst = new ArrayList<Double>();
      
      @SuppressWarnings("unchecked")
      public static void main(String[] args) {
            //Integer型リストに要素を追加
            intLst.add(123);
            intLst.add(456);
            
            //Double型リストに要素を追加
            dbLst.add(77.88);
            dbLst.add(99.00);

            // 連結結果Number型リスト
            List<Number> nbLst = new ArrayList<Number>();

            // 境界ワイルドカード型 パラメータ intLst dbLst
            nbLst = (List<Number>) testFunc(nbLst, intLst, dbLst);
            
            // リストの要素を出力
            for (Number nb : nbLst) {
                  System.out.print(nb + " ");
            }

      }
      /**
       * ジェネリックスメソッドを使ってリストを連結する関数
       * 下限境界ワイルドカード型(super) resC 
       * 上限境界ワイルドカード型(extends)
       * @param <T>
       * @param resC
       * @param cftA
       * @param cftB
       * @return
       */
      private static <T> List<? super T> testFunc(List<? super T> resC, 
                  List<? extends T> cftA, 
                  List<? extends T> cftB) {

            // リストresCの最後にリストAを追加
            resC.addAll(cftA);

            // リストresCの最後にリストBを追加
            resC.addAll(cftB);
            
            return resC;
      }

}

結果
123 456 77.88 99.0

Java

Posted by arkgame