这段代码无法编译,有什么建议可以提供吗?
...
List<Object> list = getList();
return (List<Customer>) list;
编译器报错:无法将 List<Object>
强制转换为 List<Customer>
您可以通过先向Object进行向上转型,然后将任何对象转换为任何类型。在您的情况下:
(List<Customer>)(Object)list;
在运行时,您必须确保列表中只包含Customer对象。
批评者认为这种类型转换表明您的代码存在问题;您应该能够调整类型声明以避免它。但是Java泛型太复杂了,而且它并不完美。有时你就是不知道是否有一个漂亮的解决方案来满足编译器,尽管你非常清楚运行时类型,而且你知道你正在尝试做的事情是安全的。在这种情况下,只需进行必要的粗略转换,这样您就可以把工作留给家里了。
根据您的其他代码,最佳答案可能会有所不同。 尝试:
List<? extends Object> list = getList();
return (List<Customer>) list;
或者List list = getList();
return (List<Customer>) list;
但需要记住不建议进行这样的未经检查的转换。
使用Java 8的Streams:
有时候粗暴地强制类型转换是可以的:
List<MyClass> mythings = (List<MyClass>) (Object) objects
但是这里有一个更加多才多艺的解决方案:
List<Object> objects = Arrays.asList("String1", "String2");
List<String> strings = objects.stream()
.map(element->(String) element)
.collect(Collectors.toList());
有很多好处,但其中一个是如果你不能确定它包含什么,你可以更优雅地转换你的列表:
objects.stream()
.filter(element->element instanceof String)
.map(element->(String)element)
.collect(Collectors.toList());
FluentIterable
对我有用。 - Sridhar Sarnobat这是因为尽管一个客户 是 一个对象,但是一组客户 不是 一组对象。如果是这样的话,那么就可以将 任何 对象放入客户列表中。
.Cast<T>()
,另一个叫做.OfType<T>()
。前者对每个元素执行转换(抛出所需的异常),而后者则过滤掉无法转换的元素(因此您可以根据使用场景选择其中之一)。 - BrainSlugs83你可以使用双重转换。
return (List<Customer>) (List) getList();
另一种方法是使用Java 8的流(Stream)。
List<Customer> customer = myObjects.stream()
.filter(Customer.class::isInstance)
.map(Customer.class::cast)
.collect(toList());
List<Object> list = getList();
List<Customer> customers = (List<Customer>)list;
list.Insert(0, new someOtherObjectNotACustomer());
Customer c = customers[0];
List<T>
,这正是 OP 寻求帮助的。你不能做 OP 要求的事情,但显然如果你可以接受不是 List<T>
的东西,那么有一些变通方法。 - Lasse V. KarlsenList<Customer> cusList = new ArrayList<Customer>();
for(Object o: list){
cusList.add((Customer)o);
}
return cusList;
list.stream().forEach(x->cusList.add((Customer)x))
return cuslist;
List<A> a = getListOfA();
List<Object> newList = new ArrayList<>();
newList.addAll(a);
@SuppressWarnings("unchecked")
。请注意,您还可以将其向上转型为(List)
而不是(Object)
。 - 200_success