Java 8 Stream丢失了类型信息

时间:2016-09-14 10:01:56

标签: java java-stream

我有以下流来选择符合特定条件的对象:

    protected final Map<String, PropertyMapping> propertyMappings = new LinkedHashMap();

    public List<PropertyMapping> getPropertyMappingsByAnnotation(final Class annotation) {
        return propertyMappings.values()
            .stream()
            .filter(pm -> pm.getAnnotation(annotation) != null)
            .collect(Collectors.toList());
    }

过滤器以某种方式导致Stream失去对流的泛型类型的跟踪,导致collect语句失败并出现以下错误:

incompatible types: java.lang.Object cannot be converted to java.util.List<PropertyMapping>

如果我将过滤器更改为pm - &gt;例如,流再次起作用。导致这种行为的原因是什么方法可以避免这种情况?它可能与“注释”有关。传入的类。我试图传递一个final修饰符,看看是否能解决这个问题。

这是getAnnotation方法的签名:

public final <T extends Annotation> T getAnnotation(Class<T> annotationClass)

2 个答案:

答案 0 :(得分:7)

我可以看到的一个明显问题是,您尝试将普通Class变量作为参数传递给期望Class<T> <T extends Annotation>的方法。我想编译器无法完全识别该方法调用,并且它导致流链末尾的编译错误。如果你解决了这个问题,你的神秘问题可能就会消失。

这样的事情:

public <T extends Annotation> List<PropertyMapping> 
    getPropertyMappingsByAnnotation(Class<T> annotation) {

答案 1 :(得分:0)

嗯,这里收集知道它需要生成什么样的列表(ArrayList / LinkedList)?尝试这样的事情:

List<PropertyMapping> result = propertyMappings.values().stream()
  .filter(pm -> pm.getAnnotation(annotation) != null)
  .collect(Collectors.toCollection(LinkedList::new));

如果这不起作用,那么可以尝试在Class参数或类型中添加通配符。