我正在返回List
只有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 );
}
有什么想法吗?
答案 0 :(得分:8)
如果您事先知道所有对象实际上都是CustomClass
个对象,则可以执行不安全的转换:
@SuppressWarnings("unchecked")
List<CustomClass> list = (List<CustomClass>)(List<?>)getObjects();
这是最快的解决方案;几乎在运行时,除变量赋值外,不会执行任何操作。但是,如果您出错并且您的列表实际上包含其他对象,则稍后可能会出现意外ClassCastException
。
答案 1 :(得分: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;
答案 2 :(得分: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;
}
答案 3 :(得分:1)
一些提示:
准备List
时,请确保将CustomClass
个对象添加到列表中。
customObjects.add( (CustomClass) object );
从方法getObjects()
返回对象时,这将返回CustomClass
的列表,而不是Object
的列表。
List<CustomClass> objects = getObjects();
希望这有帮助。