小编Ste*_*Kay的帖子

带泛型的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
查看次数

为什么 terminfo[kcuu1] = '\EOA'?

据我所知terminfo(5),kcuu1 应该是按下向上箭头时终端发送的序列。我从来没有见过除了^[[A(现在谈论cat,搞乱终端设置等)以外的任何东西。那么,鉴于我使用的终端(rxvt、gnome-terminal、iTerm)都默认为 TERM=xterm,为什么不是 kcuu1 \E[A

我看到 cuu1 \E[A,但是(再次从手册页),这是我应该发送到终端以移动光标的字符串,而不是终端发送给我的字符串。

顺便说一句,这是 OS X 的情况。

tty termcap terminfo

6
推荐指数
1
解决办法
1458
查看次数

标签 统计

generics ×1

java ×1

java-8 ×1

lambda ×1

termcap ×1

terminfo ×1

tty ×1