以下のコードと少し混乱しています。問題は、コードが 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()));
}
}