2015-05-26 49 views
2

我要返回List的对象只有Object类型。但是我知道在这种情况下这些对象是CustomClass转换列表<Object>到列表<CustomClass>

当我尝试将原始列表投射到CustomClass时,出现错误。

这就是我目前的工作方式,它的工作原理,但我不喜欢这个事实,我有一个for loop只是为了做到这一点。

List<Object> objects = getObjects(); 
List<CustomClass> customObjects = new ArrayList<>(); 
     for (Object object : objects) { 
      if (object instanceof CustomClass) 
       customObjects.add((CustomClass) object); 
     } 

任何想法?

+3

你能更新你的'getObjects()'方法来返回'List '吗? –

+0

getObjects的代码好吗?什么是错误? ClassCastException异常? – SMA

+1

我很确定这是一个重复(虽然没有搜索“它”)。然而,这是通常的做法(虽然它可以是一般化的,例如有一个实用方法,如'List c = filter(objects,Custom.class);') – Marco13

回答

6

如果你事先知道你所有的物体实际上是CustomClass对象,您可以执行一个不安全的转换:

@SuppressWarnings("unchecked") 
List<CustomClass> list = (List<CustomClass>)(List<?>)getObjects(); 

这是最快的解决方案;实际上在运行时除了变量赋值之外没有任何操作。但是,如果您错了,并且您的列表实际上包含其他对象,则稍后可能会出现意外的ClassCastException

2

如果你是绝对,积极确保您的列表只包含CustomClass对象,你可以在这个过程中做到这一点,沉默了很多警告

// Note, absense of generic parameter here, this is a first warning you will see 
List genericList = getObjects(); 

// Expect another 'unchecked' warning here 
List<CustomClass> typedList = (List<CustomClass>) genericList; 
1

如果你发现自己做这种过滤/铸造的时候,你可以写自己的类型安全的泛型方法:

List<Object> objects = getObjects(); 
List<CustomClass> customObjects = myFilter(objects, CustomClass.class); 

static <E> List<E> myFilter(List<?> lst, Class<E> cls) { 
    List<E> result = new ArrayList<E>(); 
    for (Object obj : lst) { 
     if (cls.isInstance(obj)) 
      result.add(cls.cast(obj)); 
    } 
    return result; 
} 
1

几个秘诀: 在准备List,确保您添加CustomClass对象名单。

customObjects.add((CustomClass) object); 

当从你的方法getObjects()返回的对象,这将返回的ObjectCustomClass,而不是名单列表。

List<CustomClass> objects = getObjects(); 

希望这会有所帮助。