小编Jac*_* G.的帖子

JDK 8中的默认值是Java中的多重继承形式吗?

JDK 8中的新功能允许您在保留二进制兼容性的同时添加到现有接口.

语法就像

public interface SomeInterface() {
  void existingInterface();
  void newInterface() default SomeClass.defaultImplementation;
}
Run Code Online (Sandbox Code Playgroud)

这种方式对于所有现有的实现,SomeInterface当它们升级到这个新版本时,它们并不会突然编译错误newInterface().

虽然这很简洁,但当你实现两个接口时会发生什么呢?两个接口都添加了一个你没有实现的新默认方法?让我举个例子来解释一下.

public interface Attendance {
   boolean present() default DefaultAttendance.present;
}

public interface Timeline {
   boolean present() default DefaultTimeline.present;
}

public class TimeTravelingStudent implements Attendance, Timeline {

}

// which code gets called?
new TimeTravelingStudent().present();
Run Code Online (Sandbox Code Playgroud)

这被定义为JDK 8的一部分了吗?

我发现Java神在这里谈论类似的东西http://cs.oswego.edu/pipermail/lambda-lib/2011-February/000068.html,但它是私人邮件列表的一部分,我不能直接问他们.

有关如何在JDK 8中使用默认值以及扩展Collection接口以支持lambdas的更多详细信息,请参阅此处:https: //oracleus.wingateweb.com/published/oracleus2011/sessions/25066/25066_Cho223662.pdf

java closures interface multiple-inheritance java-8

80
推荐指数
5
解决办法
2万
查看次数

JDK8和JDK10上三元运算符的行为差异

请考虑以下代码

public class JDK10Test {
    public static void main(String[] args) {
        Double d = false ? 1.0 : new HashMap<String, Double>().get("1");
        System.out.println(d);
    }
}
Run Code Online (Sandbox Code Playgroud)

在JDK8上运行时,此代码会打印,null而在JDK10上会生成此代码NullPointerException

Exception in thread "main" java.lang.NullPointerException
    at JDK10Test.main(JDK10Test.java:5)
Run Code Online (Sandbox Code Playgroud)

除了JDK10编译器生成的两个与自动装箱相关的附加指令外,编译器生成的字节码几乎完全相同,并且似乎负责NPE.

15: invokevirtual #7                  // Method java/lang/Double.doubleValue:()D
18: invokestatic  #8                  // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
Run Code Online (Sandbox Code Playgroud)

这种行为是JDK10中的错误还是故意更改以使行为更严格?

JDK8:  java version "1.8.0_172"
JDK10: java version "10.0.1" 2018-04-17
Run Code Online (Sandbox Code Playgroud)

java unboxing javac java-8 java-10

57
推荐指数
2
解决办法
3514
查看次数

Java 10:Java 7的Diamond推理是否适用于本地类型推断?

JEP 286开始,我们看到我们将能够var在JDK 10(18.3)中使用本地类型推理().JEP表示以下编译,这是预期的:

var list = new ArrayList<String>();  // infers ArrayList<String>
Run Code Online (Sandbox Code Playgroud)

我很想知道如果我们尝试以下内容会发生什么:

var list = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

我在第二个片段中提出的建议是否会编译?如果是这样(我怀疑),ArrayList接受是否Object为通用类型?

我自己尝试一下,但我无法访问任何我可以安装早期版本的机器.

谢谢!

java type-inference diamond-operator java-7 java-10

35
推荐指数
3
解决办法
1636
查看次数

带通用参数的主要方法; 它为什么有效?

public static <T extends String> void main(T[] args) {
    System.out.println("Hello World!");
}
Run Code Online (Sandbox Code Playgroud)

我很想知道上面的代码片段是否可以编译并成功运行,而且确实如此!但是,我也想知道如果T extends String被替换会发生什么T extends String & AutoClosable; String没有实现AutoClosable,所以我没想到这会成功运行,但它仍然存在!

public static <T extends String & AutoCloseable> void main(T[] args) {
    System.out.println("This still works!");
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,为什么这仍然成功运行?

备注:

  • 我正在使用Java 10.0.1进行测试
  • Intellij对这种方法不好看,因为它不认为它是程序的入口点; 我没有用其他IDE测试过它.
  • 您也可以使用命令行传递参数,就像使用任何其他程序一样.

java generics program-entry-point type-inference

35
推荐指数
1
解决办法
1361
查看次数

Valhalla项目的价值类型是什么?

我开始阅读有关瓦尔哈拉项目的内容,而且有一些我真的不明白的事情就是这样Value Types.

这就是我的理解:

1)对象是否无法将其作为参考进行比较?

final ValueType a = new ValueType();
final ValueType b = a;
System.out.println(a==b); returns false????
Run Code Online (Sandbox Code Playgroud)

Google AutoValue 代码示例中,它说明了

if(o == this){return true;}//equals method implementation what is this? I am comparing references here right?
Run Code Online (Sandbox Code Playgroud)

2)根据维基百科,高效的小"对象"没有继承.做什么Small Objects?Without inheritance意味着什么?

这是不可能使用VT?

public final class ValueType extends Any //is this not possible??
Run Code Online (Sandbox Code Playgroud)

3)为什么使用它们?将使用哪种方案以及如何使用它.

4)Google AutoValue Library简而言之,值类型对象是没有标识的对象,即如果它们各自的内部状态相等,则认为两个值对象相等.我的问题是:他们是否有州,他们应该实施equalshashcode.什么是没有身份的对象是什么意思?

5)这个断言是否正确?

public static void …
Run Code Online (Sandbox Code Playgroud)

java value-type project-valhalla

29
推荐指数
2
解决办法
5303
查看次数

Java 8/9:String中的字符是否可以映射到其索引(使用流)?

给定一个String schar c,我很好奇,如果存在制造的一些方法List<Integer> lists(其中内的元素list表示的索引cs).

一个接近但不正确的方法是:

public static List<Integer> getIndexList(String s, char c) {
    return s.chars()
            .mapToObj(i -> (char) i)
            .filter(ch -> ch == c)
            .map(s::indexOf) // Will obviously return the first index every time.
            .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

以下输入应产生以下输出:

getIndexList("Hello world!", 'l') -> [2, 3, 9]
Run Code Online (Sandbox Code Playgroud)

java string java-8 java-stream java-9

19
推荐指数
4
解决办法
902
查看次数

如何从流api的列表中获取随机元素?

使用Java8流API从列表中获取随机元素的最有效方法是什么?

Arrays.asList(new Obj1(), new Obj2(), new Obj3());
Run Code Online (Sandbox Code Playgroud)

谢谢.

java java-8

16
推荐指数
4
解决办法
1万
查看次数

自包含的应用程序

我已经看过几篇在Java 9中简要提到自包含应用程序的在线演示文稿,但我有一个问题需要我解决.

使用新模块系统,您现在只允许包含运行应用程序所需的最少代码.但是,希望运行应用程序的系统是否仍然需要JRE,或者是否可以包含在程序中的基本模块中?

我怀疑它是后者,因为下载最新版Java 的页面(这里)仍显示版本8_151.

TL; DR - 使用Java 9,是否可以创建一个可以在没有安装JRE/Java的系统上执行的自包含可执行文件?

java self-contained java-9 java-module

13
推荐指数
2
解决办法
4080
查看次数

为什么我可以将并行流收集到任意大型数组而不是顺序流?

从回答这个问题开始,我遇到了一个特殊的功能.下面的代码按照我的假设工作(现有数组中的前两个值将被覆盖):

Integer[] newArray = Stream.of(7, 8)
                           .parallel()
                           .toArray(i -> new Integer[] {1, 2, 3, 4, 5, 6});

System.out.println(Arrays.toString(newArray));
Run Code Online (Sandbox Code Playgroud)

输出:

[7, 8, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

但是,使用顺序流尝试此操作会抛出IllegalStateException:

Integer[] newArray = Stream.of(7, 8)
                           .toArray(i -> new Integer[] {1, 2, 3, 4, 5, 6});

System.out.println(Arrays.toString(newArray));
Run Code Online (Sandbox Code Playgroud)

输出:

Exception in thread "main" java.lang.IllegalStateException: Begin size 2 is not equal to fixed size 6
    at java.base/java.util.stream.Nodes$FixedNodeBuilder.begin(Nodes.java:1222)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:483)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:550)
    at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
    at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:517)
    at test/test.Test.main(Test.java:30)
Run Code Online (Sandbox Code Playgroud)

我很好奇为什么顺序流不会像并行流那样覆盖数组的元素.我搜索了一下,无法找到有关此的文档,但我认为它存在于某处.

java arrays java-8 java-stream

12
推荐指数
1
解决办法
163
查看次数

Java 9:如何找到添加的每个新方法

在Java 9的发布,许多方法已经被添加到许多类,大部分(如果不是全部),其中包含了文档中的以下内容:

从:9

是否有一种简单的方法可以在任意类中添加任何新方法而无需浏览其文档?

示例: ByteBuffer.alignedSlice

java methods javadoc class java-9

11
推荐指数
2
解决办法
331
查看次数