2011-02-25 41 views
1

我正在使用Arraylist来保存异构数据...... String,intclass对象的混合(这些对象可以是我定义的任何类的实例)。我已将ArrayList初始化为ArrayList<Object> = new ArrayList<Object>在arraylist中使用合适的泛型

但我觉得我听说过ppl说直接指的是对象是......。坏/不可取?我指的是这些对象,因为我无法找到适合我的案例的仿制药。可以使用还是有任何合适的仿制药? (我对Java比较陌生)

+4

你在做什么这个清单?我的第一个直觉是,即使你所做的完全是“合法的”,设计/意图也可能存在缺陷。 – Carl

+0

我试图返回这个列表,任何其他检索这个列表的方法都会提取其中的项目以供进一步处理。 – mannyee

+0

客户端对这样的列表中的元素做什么处理?它必须做到这一点,没有任何类型的具体知识。这就是你的设计? – Bhaskar

回答

2

为每种类型使用不同的列表,并将这些列表保存在地图中,并且可以使用类对象作为关键字,这样它就不会混淆并且易于访问。

Map<Class<?>,List<?>> map = new HashMap<Class<?>,List<?>>(); 
map.put(String.class, new ArrayList<String>()); 
map.put(Integer.class, new ArrayList<Integer>()); 
map.put(Class.class, new ArrayList<Class<?>>()); 

编辑:

P.S:当你从地图上检索列表中,如果要添加新的对象到列表中你仍然会得到一个未经检查的警告。

public static void main(String[] args) { 
     Map<Class<?>,List<?>> map = new HashMap<Class<?>,List<?>>(); 
     map.put(String.class, new ArrayList<String>()); 
     map.put(Integer.class, new ArrayList<Integer>()); 
     map.put(Class.class, new ArrayList<Class<?>>()); 

     String str = "deneme"; 

     @SuppressWarnings("unchecked") 
     List<String> strList = (List<String>) map.get(String.class); 
     strList.add(str); 
     strList.add("str2"); 
     strList.add("str2"); 

     @SuppressWarnings("unchecked") 
     List<Class<?>> classList = (List<Class<?>>) map.get(Class.class); 
     classList.add(String.class); 
     classList.add(Integer.class); 
     classList.add(Double.class); 


     for(String currentStr:strList){ 
      System.out.println(currentStr); 
     } 
    } 
+0

您能否发布一个工作示例,以便更清楚地了解为什么要像上述场景那样执行它。 – Deepak

+0

@Deepak一旦你从地图中检索到列表,你仍然会得到一个未经检查的强制性警告,如果你是这个意思,那么它将会是列表。地图只是为了保持列表容易访问的方式,如果你不知道有多少,什么时候需要列表未知类型T. – fmucar

+0

可以发布这种情况下的完整工作示例 – Deepak

0

如果您事先不知道目标对象的类型,那么您确实不需要使用泛型。

编译器可能会发出警告,但好男人可以做什么这样的恶魔!

注意:您实际上可以使用无界和通配符来忽略警告,但我不确定它是否会有帮助。

+0

以及我已经使用ArrayList' ,但它也不工作 – mannyee

1

当你把一个Object作为一种通用的分类,你会与很多丑陋的陈述结束了,像

if (elem instanceOf String) 
else if (elem instanceOf Integer) 

等。通常,最好使用单独的列表中为每个,例如,

List<String> strings = new LinkedList<String>(); 
List<Integer> ints = new LinkedList<Integer>(); 

因此,我会建议您重新设计程序,以更好地利用功能的Java fascilitates的。