以下代码在Java 1.8 VM中可以正常运行,但是LambdaConversionException在Java 11 VM中执行时会产生一个。区别在哪里,为什么表现得如此?
public void addSomeListener(Component comp){
if(comp instanceof HasValue) {
((HasValue<?,?>) comp).addValueChangeListener(evt -> {
//do sth with evt
});
}
}
Run Code Online (Sandbox Code Playgroud)
Caused by: java.lang.invoke.LambdaConversionException: Type mismatch
for instantiated parameter 0: class java.lang.Object is not a subtype
of interface com.vaadin.flow.component.HasValue$ValueChangeEvent
at java.base/java.lang.invoke.AbstractValidatingLambdaMetafactory.checkDescriptor(AbstractValidatingLambdaMetafactory.java:308)
at java.base/java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:294)
at java.base/java.lang.invoke.LambdaMetafactory.altMetafactory(LambdaMetafactory.java:503)
at java.base/java.lang.invoke.BootstrapMethodInvoker.invoke(BootstrapMethodInvoker.java:138)
... 73 more
Run Code Online (Sandbox Code Playgroud)
ValueChangeListener<ValueChangeEvent<?>> listener = evt -> {
// do sth with evt
};
((HasValue<?,?>) comp).addValueChangeListener(listener);
Run Code Online (Sandbox Code Playgroud)
系统:
操作系统:Windows 10
IDE:Eclipse 2018-12(4.10.0)
Java(编译):ecj …
更新:看到每个方法可能会遇到不同的性能问题,我决定将这个问题分成两个:
最初的讨论可以在下面找到......
当我遇到一些令人惊讶的数据时,我正在比较我的库在Java 8和11下的性能.这是基准代码:
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.infra.Blackhole;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class MyBenchmark
{
@Benchmark
public void emptyMethod()
{
}
@Benchmark
public void throwAndConsumeStacktrace(Blackhole bh)
{
try
{
throw new IllegalArgumentException("I love benchmarks");
}
catch (IllegalArgumentException e)
{
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
bh.consume(sw.toString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
运行jmh 1.21,OracleJDK 1.8.0_192返回:
MyBenchmark.emptyMethod avgt 25 0.363 ± 0.001 ns/op
MyBenchmark.throwAndConsumeStacktrace avgt …Run Code Online (Sandbox Code Playgroud) Java 14是非 LTS。
考虑到 6 个月发布的新版本序列,并且 8 和 11 是 LTS,Java 14 不应该是下一个 LTS 版本吗?
还是纯粹基于 Java 架构师来决定他们为 LTS 选择哪个?
我确实在网上搜索过,但找不到答案。
我无法让IntellJ识别JavaFX包.使用OpenJDK 11的新JavaFX项目,在尝试构建项目时,IntelliJ无法识别JavaFX包.
我是openjfx:javafx-base-11从Maven回购中导入的.
我已经查看了其他问题,解决方案似乎包括检查字节码是否处于正确的级别(我的是),以及项目语言是否正确(我的是).
有人有主意吗?
编辑:
错误:
Exit code: 1 - javadoc: error - The code being documented uses packages in the unnamed module, but the packages defined in https://docs.oracle.com/en/java/javase/11/docs/api/ are in named modules.
Run Code Online (Sandbox Code Playgroud)
有没有人能够使 javadoc 工作而不必将源版本更改为 1.8(如其他论坛中所建议的那样)?我正在使用 JDK v11.0.5 并且问题仍然存在(JDK 12+ 也是如此)。
编辑:此错误源自 maven 并由 maven-javadoc-plugin 抛出。即使使用<source>8</source>配置,我也无法使其适用于 JDK 11+ 。
When compiling the code below with the Java compiler from OpenJDK 8, the call to foo() is done via an invokespecial, but when OpenJDK 11 is used, an invokevirtual is emitted.
public class Invoke {
public void call() {
foo();
}
private void foo() {}
}
Run Code Online (Sandbox Code Playgroud)
Output of javap -v -p when javac 1.8.0_282 is used:
public void call();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #2 // Method foo:()V
4: return
Run Code Online (Sandbox Code Playgroud)
Output …
所以Java 11 已经出局了.有人知道如何从命令行安装它(来自Oracle的OpenJDK)吗?
我希望看到之前的Oracle Java 10:
sudo add-apt-repository ppa:linuxuprising/java
sudo apt-get update
sudo apt-get install oracle-java10-installer
Run Code Online (Sandbox Code Playgroud)
PS在提出类似问题的指导中:
sudo apt-get install openjdk-11-jdk
Run Code Online (Sandbox Code Playgroud)
不起作用.
我们计划将Java 8项目迁移到使用Java 11.但是我注意到Java 11没有JRE文件夹.
在Java 9和Java 10中,文件夹结构被更改,即,java\jdk1.x或者java\jre1.x在xjava 9或10中.
但是在Java 11中,我只获得了一个文件夹,即java\jdk-11.如果没有jre,我的客户如何使用我的应用程序?
我所理解的是Java 11正在强制模块化我们的应用程序,并且需要使用jlink来创建我们自己的jre以在客户端中运行应用程序.
我的理解是否正确?
灵感来自问题为什么Java 11基础Docker镜像如此之大?(openjdk:11-jre-slim)我发现Java世界中的这个话题还没有解决.
至于07 Dec 2018存在共同的问题/陷阱(在上面的票证中讨论):
JRE不作为单独的"包"分发.应该使用JDK的模块
Oracle OpenJDK 11不支持Linux Alpine,因此无法轻松创建轻量级图像
目前可用的Oracle openjdk-11映像构建了未剥离的libjvm.so模块,该模块有数百兆字节,必须单独剥离:
由于这些问题,即使是简洁的 Oracle Java 11基础映像也非常繁重,并且被认为是不稳定的:https://hub.docker.com/_/openjdk/
所以问题是:
什么是构建和提供Java 11应用程序作为docker镜像的优化或推荐方法?
我一直在使用JavaDocs for JDK 11
但我注意到iFrames视图似乎不再可用.我环顾四周,但看不出有关为什么要这样做的任何细节,以及有什么替代方案?谁能提供更多细节?