使用强制转换和 lambda 进行收集
Collecting with casts and lambdas
我 运行 遇到 java 8 中的一个问题,它不允许我在使用强制转换时收集对象。
definitions.stream()
.map(Definition.class::cast)
.map((Definition definition) -> {
WonderfulDefinition wd = new WonderfulDefinition();
wd.name(definition.getName());
//etc
return wd;
}).collect(Collectors.toList())
我收到编译器错误:
Error:(71, 23) java: incompatible types: inference variable T has incompatible bounds
equality constraints: java.util.List
lower bounds: java.lang.Object
如有任何帮助,我们将不胜感激。
已更新:
import java.util.*;
import java.util.stream.*;
class Driver {
public static void main(String[] args) {
List definitions = new ArrayList<>();
definitions.add(new Definition());
definitions.add(new Definition());
List<WonderfulDefinition> list =
definitions.stream()
.map(Definition.class::cast)
.map((Definition definition) -> {
WonderfulDefinition wd = new WonderfulDefinition();
wd.name(definition.getName());
//etc
return wd;
}).collect(Collectors.toList());
System.out.println(list);
}
}
class Definition {
private String name;
public String getName() {
return name;
}
public void name(String name) {
this.name = name;
}
}
class WonderfulDefinition extends Definition {
}
问题是您的 List
未键入。在这种情况下,只需通过执行转换来提示编译器:
((List<Object>) definitions).stream()
.map(Definition.class::cast)
.map(definition -> {
WonderfulDefinition wd = new WonderfulDefinition();
wd.name(definition.getName());
//etc
return wd;
}).collect(Collectors.toList());
请记住,这样的事情是完全有效的:
List definitions = Arrays.asList(new Definition());
List<Object> d = definitions;
我 运行 遇到 java 8 中的一个问题,它不允许我在使用强制转换时收集对象。
definitions.stream()
.map(Definition.class::cast)
.map((Definition definition) -> {
WonderfulDefinition wd = new WonderfulDefinition();
wd.name(definition.getName());
//etc
return wd;
}).collect(Collectors.toList())
我收到编译器错误:
Error:(71, 23) java: incompatible types: inference variable T has incompatible bounds equality constraints: java.util.List lower bounds: java.lang.Object
如有任何帮助,我们将不胜感激。
已更新:
import java.util.*;
import java.util.stream.*;
class Driver {
public static void main(String[] args) {
List definitions = new ArrayList<>();
definitions.add(new Definition());
definitions.add(new Definition());
List<WonderfulDefinition> list =
definitions.stream()
.map(Definition.class::cast)
.map((Definition definition) -> {
WonderfulDefinition wd = new WonderfulDefinition();
wd.name(definition.getName());
//etc
return wd;
}).collect(Collectors.toList());
System.out.println(list);
}
}
class Definition {
private String name;
public String getName() {
return name;
}
public void name(String name) {
this.name = name;
}
}
class WonderfulDefinition extends Definition {
}
问题是您的 List
未键入。在这种情况下,只需通过执行转换来提示编译器:
((List<Object>) definitions).stream()
.map(Definition.class::cast)
.map(definition -> {
WonderfulDefinition wd = new WonderfulDefinition();
wd.name(definition.getName());
//etc
return wd;
}).collect(Collectors.toList());
请记住,这样的事情是完全有效的:
List definitions = Arrays.asList(new Definition());
List<Object> d = definitions;