我只是在玩耍,想到了我的想法,我决定要尝试一下: 创建一个包含更多ArrayLists的ArrayList。
例如,我创建了一个名为intList的ArrayList,它保存了int,然后用值填充它。之后我做了一个stringList并填充了它。然后我创建了一个ArrayList,它包含名为aList的其他ArrayLists,并将intList和stringList添加到它。
现在我面临的问题是,如果我从aList中检索对象,它将无法识别泛型类型是int还是字符串。
这是我尝试过的代码:
import java.util.*;
public class Practice {
public static void main(String[] args) {
List<ArrayList> list = new ArrayList<ArrayList>();
ArrayList<int> intList = new ArrayList<int>();
intList.add(1);
intList.add(2);
intList.add(3);
ArrayList<String> stringList = new ArrayList<String>();
stringList.add("One");
stringList.add("Two");
stringList.add("Three");
list.add(intList);
list.add(stringList);
for(ArrayList lst : list) {
for(ArrayList lt : lst) {
System.out.println(lt);
}
}
}
}
答案 0 :(得分:3)
Java具有“泛型类型擦除”,这意味着泛型的类型参数被“擦除”。创建ArrayList<T>
后,无法找到T
的内容。
答案 1 :(得分:1)
只有类类型可以用作泛型类型参数,因此您不能拥有ArrayList<int>
。请改用ArrayList<Integer>
。
此外,循环中使用的类型是错误的。由于list
是值列表的列表,lst
是值列表,这意味着您的lt
变量将是整数或字符串,而不是另一个ArrayList
}。
这里更深层次的问题是您仍在使用原始类型,因此编译器无法为您找到该错误。您应该将list
声明为List<List<? extends Object>>
之类的内容。这样,您可以向其中添加ArrayList<Integer>
和ArrayList<String>
,并在循环中将值提取为Object
类型。
答案 2 :(得分:0)
由于没有类型信息存储在泛型类型中,您可以从子列表中获取元素并检查它的类型:
for(ArrayList subList : list) {
if (subList.size() > 0) {
Class elementClass = subList.get(0).getClass();
// do something else with it
}
}
可是:
答案 3 :(得分:0)
类型擦除意味着在运行时,类型被擦除。这就是为什么你可以从一个泛型转换为另一个:
import java.util.ArrayList;
public class Test {
public static void main(String [] args){
ArrayList<String> list = new ArrayList<String>();
ArrayList list2 = (ArrayList)list;
list2.add(new Integer(5));
System.out.println(list2.get(0).getClass());
}
}
将输出:
class java.lang.Integer
答案 4 :(得分:0)
import java.util.*;
public class Practice {
public static void main(String[] args) {
List<ArrayList<?>> list = new ArrayList<ArrayList<?>>();
ArrayList<Integer> intList = new ArrayList<Integer>();
intList.add(1);
intList.add(2);
intList.add(3);
ArrayList<String> stringList = new ArrayList<String>();
stringList.add("One");
stringList.add("Two");
stringList.add("Three");
list.add(intList);
list.add(stringList);
for(ArrayList<?> lst : list) {
for(Object lt : lst) {
System.out.println(lt);
}
}
}
}