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
请考虑以下代码
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) 从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
为通用类型?
我自己尝试一下,但我无法访问任何我可以安装早期版本的机器.
谢谢!
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)
所以我的问题是,为什么这仍然成功运行?
备注:
我开始阅读有关瓦尔哈拉项目的内容,而且有一些我真的不明白的事情就是这样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
简而言之,值类型对象是没有标识的对象,即如果它们各自的内部状态相等,则认为两个值对象相等.我的问题是:他们是否有州,他们应该实施equals
和hashcode
.什么是没有身份的对象是什么意思?
5)这个断言是否正确?
public static void …
Run Code Online (Sandbox Code Playgroud) 给定一个String s
和char c
,我很好奇,如果存在制造的一些方法List<Integer> list
从s
(其中内的元素list
表示的索引c
内s
).
一个接近但不正确的方法是:
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) 使用Java8流API从列表中获取随机元素的最有效方法是什么?
Arrays.asList(new Obj1(), new Obj2(), new Obj3());
Run Code Online (Sandbox Code Playgroud)
谢谢.
我已经看过几篇在Java 9中简要提到自包含应用程序的在线演示文稿,但我有一个问题需要我解决.
使用新模块系统,您现在只允许包含运行应用程序所需的最少代码.但是,希望运行应用程序的系统是否仍然需要JRE,或者是否可以包含在程序中的基本模块中?
我怀疑它是后者,因为下载最新版Java 的页面(这里)仍显示版本8_151.
TL; DR - 使用Java 9,是否可以创建一个可以在没有安装JRE/Java的系统上执行的自包含可执行文件?
从回答这个问题开始,我遇到了一个特殊的功能.下面的代码按照我的假设工作(现有数组中的前两个值将被覆盖):
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 9的发布,许多方法已经被添加到许多类,大部分(如果不是全部),其中包含了文档中的以下内容:
从:9
是否有一种简单的方法可以在任意类中添加任何新方法而无需浏览其文档?