1

以下のコードと少し混乱しています。問題は、コードが List < T > が T と同じ型を持つように見えることです。メソッドmakeListが型 DTOInt< T> のパラメーターを受け取り、List< T>(T のリスト) を返すことを考慮してください。DTOInt< T> の 'T getData() メソッド' を実装するクラス DTO であるため、DTOInt インターフェイスには、getData() メソッドの戻り値の型であるジェネリック定義 T があります。

したがって、makeListメソッド内で、メソッドgetData()が返すオブジェクト (T タイプ) を List < T> に明確にキャストします。そして、それはコンパイルして正常に実行されます。

コンパイルについては明らかです - 明らかなキャストがありますが、実行時に makeList() メソッドのキャスト行で ClassCastException で失敗しない方法はありますか?

interface DTOInt<T>{
    T getData(); 
}

class DTO implements DTOInt<List<List<String[]>>>{
    public List<List<String[]>> getData() {
        String[] arr = {"1.1","1.2","1.3"};
        String[] arr1 = {"2.1","2.2","2.3"};

        List<String[]> l = new ArrayList<String[]>();

        l.add(arr);
        l.add(arr1);

        List<List<String[]>> data = new ArrayList<List<String[]>> ();
            data.add(l);

        return data;
    }

}

public class Test {

    static <T> List<T> makeList(DTOInt<T> inp){
        T data = inp.getData();
        List<T> list = (List<T>) data;
        return list;
    }

    public static void main(String[] args) {
        System.out.println(makeList(new DTO()));
    }
}
4

1 に答える 1