相关疑难解决方法(0)

带泛型的LambdaConversionException:JVM错误?

我有一些带有方法引用的代码,它可以很好地编译并在运行时失败.

例外是这样的:

Caused by: java.lang.invoke.LambdaConversionException: Invalid receiver type class redacted.BasicEntity; not a subtype of implementation type interface redacted.HasImagesEntity
    at java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:233)
    at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:303)
    at java.lang.invoke.CallSite.makeSite(CallSite.java:289)
Run Code Online (Sandbox Code Playgroud)

触发异常的类:

class ImageController<E extends BasicEntity & HasImagesEntity> {
    void doTheThing(E entity) {
        Set<String> filenames = entity.getImages().keySet().stream()
            .map(entity::filename)
            .collect(Collectors.toSet());
    }
}
Run Code Online (Sandbox Code Playgroud)

抛出异常试图解决entity::filename.filename()宣布在HasImagesEntity.据我所知,我得到了异常,因为E的删除是BasicEntity,JVM没有(不能?)考虑E上的其他界限.

当我将方法引用重写为一个普通的lambda时,一切都很好.对我来说,一个构造按预期工作并且它的语义等价物爆炸似乎真的很可疑.

这可能是在规范中吗?我正在努力寻找一种不会在编译器或运行时出现问题的方法,并且没有提出任何建议.

java generics lambda java-8

21
推荐指数
3
解决办法
2589
查看次数

奇怪的例外"无效的接收器类型类java.lang.Object;不是...的子类型"

我在使用jre1.8.0_66的代码运行中遇到这个奇怪的异常:

Exception in thread "main" java.lang.BootstrapMethodError: call site initialization exception
    at java.lang.invoke.CallSite.makeSite(CallSite.java:341)
    at java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:307)
    at java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:297)
    at main
Caused by: java.lang.invoke.LambdaConversionException: Invalid receiver type class java.lang.Object; not a subtype of implementation type interface Fruit
    at java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:233)
    at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:303)
    at java.lang.invoke.CallSite.makeSite(CallSite.java:302)
    ... 3 more
Run Code Online (Sandbox Code Playgroud)

这是什么意思?代码如下:

public static interface Fruit {

    int getPickingMonth();
}

public static class Apple implements Fruit, Serializable {

    @Override
    public int getPickingMonth() {
        return 11;
    }
}

public static class Orange implements Fruit, Serializable {

    @Override
    public int …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

13
推荐指数
1
解决办法
2912
查看次数

通过流加入字符串

我想加入一个名单:

List<String> names;
names = books.stream()
        .map( b -> b.getName() )
        .filter( n -> ( (n != null) && (!n.isEmpty()) ) )
        .collect(Collectors.joining(", "));
Run Code Online (Sandbox Code Playgroud)

这不会编译说:

不兼容的类型.推理变量R具有不兼容的边界

所以经过一些研究,似乎有些东西我误解了.我认为.map( b -> b.getName() )返回/将类型更改为String,似乎有些错误.如果我使用.map(Book::getName),我仍然会收到错误,但我可能并不完全理解其中的差异.

但是,这不抱怨:

List<String> names;
names = books.stream()
        .map( b -> b.getName() )
        .map( Book::getName )
        .filter( n -> ( (n != null) && (!n.isEmpty()) ) )
        .collect(Collectors.joining(", "));
Run Code Online (Sandbox Code Playgroud)

有人能解释一下为什么吗?关于它们之间的差异的一些教学解释.map( b -> b.getName() ).map(Book::getName)被赞赏,因为我认为我没有做对.

java-8

3
推荐指数
1
解决办法
457
查看次数

标签 统计

java-8 ×3

java ×2

generics ×1

java-stream ×1

lambda ×1