在不知道类型的情况下用Java创建集合?

时间:2014-08-17 19:33:12

标签: java collections

例如,我可以创建包含String和其他List的列表吗?如果我能做到这一点,我的名单的具体内容是什么?我可以说它包含Object类型的数据,对吗?

3 个答案:

答案 0 :(得分:2)

是的,您可以使用:

List<Object> list = new ArrayList<>();
list.add("A string");
list.add(new ArrayList<Foo>());
// etc

通常 并不是一个好主意,因为当您获得列表的 out 时,找出您需要做的事情可能会很痛苦。如果您可以设计出自己的方法,那将是一个好主意......但上面的工作

答案 1 :(得分:0)

类型安全的异构集合,没有支持和类型的语言,变得非常毛茸茸。以下是包含Stringint的列表示例。

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());
    }

}