在下面的代码中,类型参数D
可以是 aList<Byte>
或 a List<List<Byte>>
(它是Fields<?, ?, D>
接口中的第三个泛型参数,但我仍然可以在此处省略它 - 但它也存在于方法的返回类型中)。似乎无法找到一种方法来告诉编译器这一点 -Unchecked cast
在标记的行中获取警告//*
:
public static <D, K, T extends Enum<T> & Fields<?, ?, D>> List<EnumMap<T, D>>
getEntries(InputStream is, Class<T> fields) throws IOException {
final List<List<Byte>> entries = new ArrayList<List<Byte>>();
// populate "entries"
final boolean hasLists = hasLists(fields);
List<K> daBytes;
if (hasLists) {
daBytes = (List<K>) new ArrayList<EnumMap<T, List<List<Byte>>>>(); //*
} else {
daBytes = (List<K>) new ArrayList<EnumMap<T, List<Byte>>>(); //*
}
final int numOfEntries = entries.size();
for (int currentEntry = 0; currentEntry < numOfEntries; ++currentEntry) {
// add an element in daBytes for this currentEntry
if (hasLists) {
daBytes.add((K) new EnumMap<T, List<List<Byte>>>(fields)); //*
} else {
daBytes.add((K) new EnumMap<T, List<Byte>>(fields)); //*
}
for (T daField : fields.getEnumConstants()) {
List<Byte> field = new ArrayList<Byte>();
// populate "field"
D map = (D) daBytes.get(currentEntry);
if (hasLists) {
List<List<Byte>> fieldEntries = new ArrayList<List<Byte>>();
// populate "fieldEntries"
((EnumMap<T, List<List<Byte>>>) map).put(daField,
fieldEntries); //*
} else {
((EnumMap<T, List<Byte>>) map).put(daField, field); //*
}
}
}
return (List<EnumMap<T, D>>) daBytes; //*
}
如果hasLists
是假的,那么我需要 D 是一个List<Byte>
else a List<List<Byte>>
。daList
变量是List<EnumMap<T, D>>
一个。现在(对我来说)定义似乎很自然:
List<EnumMap<T, D>> daBytes;
但是一旦我这样做并改变:
if (hasLists) {
daBytes = (List<EnumMap<T, D>>) new ArrayList<EnumMap<T, List<List<Byte>>>>();
}
我收到一个错误:
不能从
ArrayList<EnumMap<T,List<List<Byte>>>>
到List<EnumMap<T,D>>
一直在循环使 daBytes 成为对象,List<?>
等等,但总是使用直接强制转换或导致警告的通用强制转换。必须有一种方法可以在没有强制转换的情况下干净地编译