假设我正在制作一个Android库(以分发.aar),并且我想在内部库代码中使用Java 8语言功能。基本内容,例如lambdas等。
以我的经验,如果我随后汇编并发布此库,则任何依赖它的开发人员都将在构建时出错,除非他们将其添加到他们的build.gradle:
android {
// ...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以编译我的库,从而使消费者不必这样做吗?假定该库的公共API表面不包含任何Java 8特定功能。
我正在审查github上的HikariCP项目,它声明它支持"Java 7和Java 8 maven artifact",在其源代码中,它使用了一些Java 8特性:
java.util.function.Consumer;
java.util.function.Predicate;
java.util.function.UnaryOperator;
Run Code Online (Sandbox Code Playgroud)
我想如果其他人使用Java 7引用此项目,则会发生错误.那么,该项目如何使其同时支持Java 7和Java 8?
如果我理解正确,Java 10的二进制形式与Java 9完全相同,那么它不会产生任何问题.
我的假设是否正确?
Java 10引入了本地类型推理,这非常酷:
var list = new ArrayList<String>(); // Compiles fine
Run Code Online (Sandbox Code Playgroud)
但是,似乎人们不愿意在新版本发布的那一天(周,月,年)更新他们的Java版本.
这意味着我需要等到Java 8的EOL才可以使用,List.of(1, 2, 3)如果想要支持使用旧Java版本的大多数用户.
另一方面,当编译为字节码时,可能会推断出本地类型推断,因此可能使用它的程序可能会在较旧的Java版本(9或8)上运行.另一方面,Java似乎喜欢在运行时进行优化,这可能意味着类型推断需要JRE版本10.
有人试过这个吗?使用类型推断的程序是否在较旧的Java版本上运行?
感谢您的意见.