以下简单类(repo重现它):
import static org.hamcrest.*;
import static org.junit.Assert.assertThat;
import java.util.*;
import org.junit.Test;
public class TestGenerics {
@Test
public void thisShouldCompile() {
List<String> myList = Arrays.asList("a", "b", "c");
assertThat("List doesn't contain unexpected elements", myList, not(anyOf(hasItem("d"), hasItem("e"), hasItem("f"))));
}
}
Run Code Online (Sandbox Code Playgroud)
行为取决于JDK版本:
出现以下错误:
[ERROR] /tmp/jdk-issue-generics/src/test/java/org/alostale/issues/generics/TestGenerics.java:[17,17] no suitable method found for assertThat(java.lang.String,java.util.List<java.lang.String>,org.hamcrest.Matcher<java.lang.Iterable<? super java.lang.Object>>)
method org.junit.Assert.<T>assertThat(java.lang.String,T,org.hamcrest.Matcher<? super T>) is not applicable
(inference variable T has incompatible bounds
upper bounds: java.lang.String,java.lang.Object
lower bounds: capture#1 of ? super T?,capture#2 …Run Code Online (Sandbox Code Playgroud) 在阅读并讨论Java 10s新保留类型名称var
(JEP 286:局部变量类型推断)之后,讨论中出现了一个问题.
与文字一起使用时,如:
var number = 42;
Run Code Online (Sandbox Code Playgroud)
是number现在的int还是一个Integer?如果您只是将它与比较运算符一起使用或作为参数使用它通常无关紧要,这要归功于自动装箱和开箱.但由于Integer成员职能,它可能很重要.
那么哪个类型是由原var语int或类创建的Integer?
作为公认的一部分JDK 10本JEP 312:线程局部握手提出.
我试图理解它的描述,但我仍然不相信我的想法是正确的.
它本质上是尝试恢复类似于弃用的Thread.destroy()的东西吗?
这个界面在理论上怎么样?
我正在开发Eclipse中的Maven项目(branch platform-bom_brussels-sr7).当我最近尝试切换Java构建路径,为项目JDK 10,Eclipse构建再也找不到类,如javax.xml.xpath.XPath,org.w3c.dom.Document或org.xml.sax.SAXException.似乎只有XML相关的类受到影响,主要来自Maven依赖xml-apis-1.4.01.
从Eclipse中尝试Maven构建工作没有错误.Ctrl-LeftClick上一个假定缺失的类找到该类并在Eclipse编辑器中打开它.似乎只有Eclipse构建受到影响.
我尝试了几件事,但都没有帮助.我试过了:
我试图理解Java 10中的局部变量类型推断.
下面的代码在编译和运行时完美运行:
List list1 = Arrays.asList(1L, 2.0F, "3");
var list2 = list1;
Run Code Online (Sandbox Code Playgroud)但是,此行会引发编译错误:
var list3 = Arrays.asList(1L, 2.0F, "3");
Run Code Online (Sandbox Code Playgroud)
Error:java: java.lang.AssertionError: Unexpected intersection type: java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>
我真的不明白为什么第二种情况是错误的但不是第一种情况.因为我想到,编译器会推断出的类型list1和治疗list2以及list3相同.提前致谢.
Java 10 var为本地类型推断带来了类似C#的关键字.
但是Java 10还提供了一个val关键字,就像在Scala中找到的那样?
val会工作,var但绑定会final.
var x = "Hello, world. ";
x = "abc"; // allowed
val y = "Hello, world. ";
y = "abc"; // forbidden
Run Code Online (Sandbox Code Playgroud)
如果没有,是否有这种情况的原因?
遵循JEP 286:局部变量类型推断描述
我想知道,引入这种限制的原因是什么,如:
Run Code Online (Sandbox Code Playgroud)Main.java:199: error: cannot infer type for local variable k var k = { 1 , 2 }; ^ (array initializer needs an explicit target-type)
所以对我来说逻辑上它应该是:
var k = {1, 2}; // Infers int[]
var l = {1, 2L, 3}; // Infers long[]
Run Code Online (Sandbox Code Playgroud)
因为Java编译器已经可以正确地推断出数组的类型:
void decide() {
arr(1, 2, 3); // call void arr(int ...arr)
arr(1, 2L, 3); // call void arr(long ...arr)
}
void arr(int ...arr) {
}
void arr(long ...arr) {
} …Run Code Online (Sandbox Code Playgroud) 我知道我们可以使用"var"关键字在Kotlin中定义变量:
var foo = 3
Run Code Online (Sandbox Code Playgroud)
最新的java更新(java 10)也引入了"var"类型:
var bar = new int[]{1, 2, 3}; // int[] bar = {1, 2, 3}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这些语言之间使用"var"的区别是什么?
从Java 9升级到10后,链接到JDK不再工作时的Javadoc工具生成的文件(例如,对于文件导入java.util.Optional,{@link Optional}呈现为Optional而不是作为Optional;同一个问题有@see,@param,@return,和其他地方,你通常看到的Javadoc链接).
我有一个简单的模块化项目,我使用Maven用的Javadoc插件(source和target选项设置10在configuration编译器插件部分).我的理解是,默认情况下它会传递-link https://docs.oracle.com/javase/10/docs/api/给Javadoc工具.我的理解是,从历史上看,Javadoc工具期望一个名为的文本文件package-list存在于被告知要查找外部文档的URL中.Java 8 有一个.Java 9 有一个.Java 10 没有(404错误).显然,Javadoc工具现在输出一个名为element-list而不是package-list模块化项目的文本文件,但似乎也没有提供(Java 9也没有提供,但它可用于早期访问的Java 11版本).
通过IntelliJ生成Javadoc并Link to JDK documentation启用该选项会产生相同的结果.它说,它传递-link https://docs.oracle.com/javase/10/docs/api/给javadoc.exe,并报告javadoc: error - Error fetching URL: https://docs.oracle.com/javase/10/docs/api/.尽管有错误,它确实输出了Javadoc,但与Maven一样,没有JDK链接.
这应该怎么样?当他们将JDK文档放到网上时,Oracle是否搞砸了?
我的相关部分pom.xml:
<build>
<plugins>
<plugin> …Run Code Online (Sandbox Code Playgroud) Java 10附带了新的局部变量类型推断.令牌var可用于减少声明变量时所需的样板.例如
var s = "hello";
Run Code Online (Sandbox Code Playgroud)
根据什么类型的令牌在Java 10中完全是"var"?这个新令牌不是"关键字",而是"保留类型名称".因此,单词"var"仍然可以用作变量名,它保持与现有代码的向后兼容性.
var var = "you can do this";
Run Code Online (Sandbox Code Playgroud)
当在Java 9中引入"模块"功能时,这个新令牌的类型(以及其他9个相关令牌)被称为"受限制的关键字".也就是说,它们仅被视为特定上下文特定限制下的关键字.例如,您仍然可以使用称为模块的变量.
当新的语言功能以不会破坏现有用户定义符号的方式添加到C++时,它们被称为"上下文相关关键字".
varJava 10中新的"保留类型名称" 标记与"上下文相关关键字"或"受限制关键字" 之间是否存在概念差异.也就是说,var在某些特定于上下文的限制下,新令牌不仅仅是一个关键字.如果是这种情况,为什么不将它简单地添加到"受限制的关键字"列表中?
为了进一步增加我的混淆,JLS的当前草案版本说:
字符序列var通常被视为标识符,但在某些特殊情况下,其行为就像是关键字一样.
这个定义听起来像是一个"受限制的关键字".