我在使用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
什么意思 代码如下:
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 getPickingMonth() {
return 2;
}
}
public static void main(String[] args) {
List<Apple> apples = Arrays.asList(new Apple());
List<Orange> oranges = Arrays.asList(new Orange());
Stream.of(apples.stream(), oranges.stream())
.flatMap(Function.identity())
.map(Fruit::getPickingMonth) // exception occurs on this line
.forEachOrdered(System.out::println);
}
如果我更改Fruit::getPickingMonth
为,异常会消失x -> x.getPickingMonth()
。
这样做的价值:
如果我Serializable
从任一类中删除,该异常也将消失。但是如果我在两个类中都添加了另一个等效的接口(例如,Cloneable
或某些自定义接口),则会返回。
每当涉及交集类型并且您使用的方法引用使用的接收器类型不是第一个(第一个类型是在类型擦除之后将保留的类型)时,都会发生此问题。
因此,当您用lambda表达式替换方法引用时,您将不再受到该错误的影响。如果Serializable
从类型中删除,则的推断元素类型Stream
将为Fruit
,即不是交集类型,同样不会发生此问题。但是,通过实现Fruit
和的两种元素类型Serializable
,编译器将推断出元素类型Object&Fruit&Serializable
,而原始类型将是原始类型Object
,当使用带有接收器类型的方法引用时,原始类型将引发错误Fruit
。您可以轻松解决此问题:
Stream.of(apples.stream(), oranges.stream())
.<Fruit>flatMap(Function.identity())
.map(Fruit::getPickingMonth) // no more exception on this line
.forEachOrdered(System.out::println);
编译后的代码将与您的原始代码相同,但是操作的正式结果类型flatMap
将为Stream<Fruit>
,而忽略推断出的交集类型的所有其他工件。结果,方法引用Fruit::getPickingMonth
将Function<Fruit,Integer>
代替实现类型,Function<Object&Fruit&Serializable,Integer>
并且不会出现编译器错误。
但是请注意,您的代码不必要地复杂。您可以简单地使用
Stream.<Fruit>concat(apples.stream(), oranges.stream())
.map(Fruit::getPickingMonth) // no more exception on this line
.forEachOrdered(System.out::println);
实现相同。
我正在尝试从服务器获取json数据
我正在开发我的flutter应用程序的身份验证。请帮我解决这个问题。我无法识别返回这样一个错误的问题,声明未处理异常:类型列表不是类型字符串的子类型。 以下是登录屏幕的代码: 执行登录的上述代码部分: 错误
更新:感谢@Rjulcaa回答我的地图现在是一个列表,但是列表没有显示在用户界面上。我转过来,我需要用FutureBuilder来处理未来,所以如果有人面临这个问题,记得在你的用户界面主体中添加一个FutureBuilder,并在构建器上返回你想要显示的小部件。 我正在制作一个todo列表教程,我正在尝试添加JSON上的编码功能,我的todoList将其保存在SharedReferences上,当
上面的代码给出了警告未处理的异常:类型'double'不是类型'string'的子类型
//为(int i=0; i创建具有100个存储空间的数组 //提示用户输入要查找的索引
我试图显示用户图像URL在CircleAvatar();它显示一个空错误,即使我已经提供了它。还是我做错了? 首先,我调用Auth方法和设置图像字符串img, 然后在initstate中实例化 然后把它放在抽屉里()