标签: java-10

泛型行为在JDK 8和9中有所不同

以下简单类(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版本:

  • 在JDK <= 8中正确编译(用7和8测试)
  • 使用JDK 9+编译失败(使用9,10和11 EA测试)

出现以下错误:

[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 generics java-8 java-9 java-10

33
推荐指数
1
解决办法
1046
查看次数

在原语或原始包装类中使用带有文字结果的var吗?

在阅读并讨论Java 10s新保留类型名称var (JEP 286:局部变量类型推断)之后,讨论中出现了一个问题.

与文字一起使用时,如:

var number = 42;
Run Code Online (Sandbox Code Playgroud)

number现在的int还是一个Integer?如果您只是将它与比较运算符一起使用或作为参数使用它通常无关紧要,这要归功于自动装箱和开箱.但由于Integer成员职能,它可能很重要.

那么哪个类型是由原varint或类创建的Integer

java type-inference local-variables java-10

32
推荐指数
3
解决办法
1515
查看次数

线程局部握手的解释

作为公认的一部分JDK 10JEP 312:线程局部握手提出.

我试图理解它的描述,但我仍然不相信我的想法是正确的.

它本质上是尝试恢复类似于弃用的Thread.destroy()的东西吗?

这个界面在理论上怎么样?

java multithreading java-threads java-10

29
推荐指数
1
解决办法
2967
查看次数

在将构建路径切换到JDK 10之后,Eclipse无法找到与XML相关的类

我正在开发Eclipse中的Maven项目(branch platform-b​​om_brussels-sr7).当我最近尝试切换Java构建路径,为项目JDK 10,Eclipse构建再也找不到类,如javax.xml.xpath.XPath,org.w3c.dom.Documentorg.xml.sax.SAXException.似乎只有XML相关的类受到影响,主要来自Maven依赖xml-apis-1.4.01.

从Eclipse中尝试Maven构建工作没有错误.Ctrl-LeftClick上一个假定缺失的类找到该类并在Eclipse编辑器中打开它.似乎只有Eclipse构建受到影响.

我尝试了几件事,但都没有帮助.我试过了:

  • 项目清洁
  • 不同的Eclipse版本:氧气和光子.
  • 使用JDK 8和JDK 10运行Eclipse本身.
  • 更改项目的编译器合规性级别.它在JDK 8构建路径下以符合级别8和10构建,并且在构建路径中使用JDK 10都失败.

java eclipse maven java-10

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

为什么在直接将Arrays.asList()分配给var时会出现AssertionError?

我试图理解Java 10中的局部变量类型推断.

  1. 下面的代码在编译和运行时完美运行:

    List list1 = Arrays.asList(1L, 2.0F, "3");
    var list2 = list1;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 但是,此行会引发编译错误:

    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 arrays type-inference exception java-10

28
推荐指数
2
解决办法
759
查看次数

Java 10是否提供val关键字?如果没有,为什么不呢?

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)

如果没有,是否有这种情况的原因?

java type-inference java-10

27
推荐指数
3
解决办法
6873
查看次数

"数组初始化程序需要一个明确的目标类型" - 为什么?

遵循JEP 286:局部变量类型推断描述

我想知道,引入这种限制的原因是什么,如:

Main.java:199: error: cannot infer type for local variable k

    var k = { 1 , 2 };
        ^   
(array initializer needs an explicit target-type)
Run Code Online (Sandbox Code Playgroud)

所以对我来说逻辑上它应该是:

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)

java arrays local-variables java-10

25
推荐指数
2
解决办法
892
查看次数

java 10和kotlin中的"var"

我知道我们可以使用"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 var kotlin java-10

23
推荐指数
3
解决办法
2430
查看次数

无法在Javadoc注释中链接到JDK10

从Java 9升级到10后,链接到JDK不再工作时的Javadoc工具生成的文件(例如,对于文件导入java.util.Optional,{@link Optional}呈现为Optional而不是作为Optional;同一个问题有@see,@param,@return,和其他地方,你通常看到的Javadoc链接).

我有一个简单的模块化项目,我使用Maven用的Javadoc插件(sourcetarget选项设置10configuration编译器插件部分).我的理解是,默认情况下它会传递-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 javadoc maven maven-javadoc-plugin java-10

22
推荐指数
3
解决办法
2120
查看次数

Java 10中"受限关键字"和"保留类型名称"之间的概念差异是什么?

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通常被视为标识符,但在某些特殊情况下,其行为就像是关键字一样.

这个定义听起来像是一个"受限制的关键字".

java java-10

20
推荐指数
1
解决办法
824
查看次数