例如,我可以创建包含String
和其他List
的列表吗?如果我能做到这一点,我的名单的具体内容是什么?我可以说它包含Object
类型的数据,对吗?
答案 0 :(得分:2)
是的,您可以使用:
List<Object> list = new ArrayList<>();
list.add("A string");
list.add(new ArrayList<Foo>());
// etc
通常 并不是一个好主意,因为当您获得列表的 out 时,找出您需要做的事情可能会很痛苦。如果您可以设计出自己的方法,那将是一个好主意......但上面的工作。
答案 1 :(得分:0)
类型安全的异构集合,没有支持和类型的语言,变得非常毛茸茸。以下是包含String
和int
的列表示例。
import java.util.ArrayList;
import java.util.List;
public class Foo {
public static void main(String[] args) {
// Construct the list by wrapping the elements in StringOrInt
List<StringOrInt> list = new ArrayList<>();
list.add(StringOrInt.apply("abc"));
list.add(StringOrInt.apply(4));
// Use the elements by applying a StringOrInt.Visitor.
List<String> list2 = new ArrayList<>();
for (StringOrInt x : list) {
list2.add(x.apply(new StringOrInt.Visitor<String>() {
public String caseString(String x) { return "String: " + x; }
public String caseInt(int x) { return "Int: " + x; }
}));
}
System.out.println(list2); // [String: abc, Int: 4]
}
}
abstract class StringOrInt {
interface Visitor<A> {
A caseString(String x);
A caseInt(int x);
}
private StringOrInt() {}
abstract <A> A apply(Visitor<A> visitor);
static StringOrInt apply(String x) { return new String_(x); }
static StringOrInt apply(int x) { return new Int_(x); }
private static final class String_ extends StringOrInt {
final String x;
String_(String x) { this.x = x; }
<A> A apply(Visitor<A> visitor) { return visitor.caseString(x); }
}
private static final class Int_ extends StringOrInt {
final int x;
Int_(int x) { this.x = x; }
<A> A apply(Visitor<A> visitor) { return visitor.caseInt(x); }
}
}
答案 2 :(得分:0)
享受测试用例
import java.util.LinkedList;
import java.util.List;
import org.junit.Test;
import static org.junit.Assert.*;
public class TestGenerics {
@Test
public void listOfObjects() {
List<Object> objList = new LinkedList<Object>();
objList.add("alphabeta");
objList.add(Integer.valueOf(888));
assertEquals("alphabeta",(String)(objList.get(0)));
assertEquals(888, ((Integer)(objList.get(1))).intValue());
}
@Test
@SuppressWarnings({ "rawtypes", "unchecked" })
public void listOfElementsThatAreSubclassedFromObject() {
List<? extends Object> objList = new LinkedList();
// objList.add("alphabeta"); // WILL NOT COMPILE
objList.add(null); // Only null can be added to this list
}
@Test
@SuppressWarnings({ "rawtypes", "unchecked" })
public void listOfElementsThatHaveSupertypeObject() {
List<? super Object> objList = new LinkedList();
objList.add("alphabeta");
objList.add(Integer.valueOf(888));
assertEquals("alphabeta",(String)(objList.get(0)));
assertEquals(888, ((Integer)(objList.get(1))).intValue());
}
@Test
@SuppressWarnings({ "rawtypes", "unchecked" })
public void rawListIsAlsoNice() {
List objList = new LinkedList();
objList.add("alphabeta");
objList.add(Integer.valueOf(888));
assertEquals("alphabeta",(String)(objList.get(0)));
assertEquals(888, ((Integer)(objList.get(1))).intValue());
}
}