(注:编辑问题;先前意图不明确)
考虑以下代码:
public final class Foo
{
private enum X
{
VALUE1, VALUE2
}
public static void main(final String... args)
{
final X x = X.VALUE1;
switch (x) {
case VALUE1:
System.out.println(1);
break;
case VALUE2:
System.out.println(2);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常.
但是,如果我更换:
case VALUE1: // or VALUE2
Run Code Online (Sandbox Code Playgroud)
有:
case X.VALUE1: // or X.VALUE2
Run Code Online (Sandbox Code Playgroud)
然后编译器抱怨:
java:/path/to/Foo.java:whatever:枚举开关案例标签必须是枚举常量的非限定名称
(需要内联常量的一个原因是switch语句在每种情况下都需要常量,并且没有两个这样的常量值可能是相同的.编译器在编译时检查switch语句中的重复常量值;类文件格式不做案例值的象征性联系.)
但这并不能让我满意.就我而言,VALUE1
并且X.VALUE1
完全一样.引用的文字对我来说根本没有解释.
在JLS中定义语句中的enum
值switch
是否必须以这种方式写入?
JDK是甲骨文的JDK 1.8u65,但问题是"低至"1.8u25.
这是完整的SSCCE:
public final class Foo
{
private interface X
{
default void x()
{
}
}
private enum E1
implements X
{
INSTANCE,
;
}
private enum E2
implements X
{
INSTANCE,
;
}
public static void main(final String... args)
{
Stream.of(E1.INSTANCE, E2.INSTANCE).forEach(X::x);
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译; 但它在运行时失败:
Exception in thread "main" java.lang.BootstrapMethodError: call site initialization exception
at java.lang.invoke.CallSite.makeSite(CallSite.java:341)
at java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:307)
at java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:297)
at com.github.fge.grappa.debugger.main.Foo.main(Foo.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.invoke.LambdaConversionException: …
Run Code Online (Sandbox Code Playgroud) 在我看来,明显的代码,当使用Java 8时Stream
,无论它们是"对象"流还是原始流(即IntStream
和朋友)都只是使用:
someStreamableResource.stream().whatever()
Run Code Online (Sandbox Code Playgroud)
但是,相当多的"可流动资源"也有.parallelStream()
.
读取javadoc时不清楚的是.stream()
流是否始终是顺序的,以及.parallelStream()
流是否始终是并行的...
然后有Spliterator
,特别是它.characteristics()
,其中一个是它可以CONCURRENT
,甚至IMMUTABLE
.
我的直觉是,事实上,Stream
默认情况下是否可以并行,或者根本不是并行,是由其潜在的Spliterator
...
我是在正确的轨道上吗?我已经阅读并再次阅读了javadocs,但仍然无法对这个问题做出明确答案......
[序言:道歉,这里有很多代码,其中一些可能与这个问题无关,而一些理解问题所必需的代码可能会丢失; 请评论,我会相应地编辑问题.]
环境:Ubuntu 14.10 x86_64; Oracle JDK 1.8u25.单元测试库是TestNG,版本6.8.13; Mockito是版本1.10.17.
在我的GUI应用程序中,JavaFX称之为"控制器"的东西是非常被动的,因为这个"控制器"(我称之为"显示器")真正做的唯一事情就是发送事件.
现在,当收到需要GUI更新的事件时,它是另一个类,我称之为视图,它负责更新GUI.简而言之:
显示 - >演示者 - >视图 - >显示
我有两个单元测试:
所以,我在这方面已经被覆盖了(我可以改变显示器的优势,这就是我这样做的原因).
但现在我尝试测试"视图 - >显示"部分; 我是SOL.
作为说明,这里是视图类:
@NonFinalForTesting
public class JavafxTreeTabView
extends JavafxView<TreeTabPresenter, TreeTabDisplay>
implements TreeTabView
{
private final BackgroundTaskRunner taskRunner;
public JavafxTreeTabView(final BackgroundTaskRunner taskRunner)
throws IOException
{
super("/tabs/treeTab.fxml");
this.taskRunner = taskRunner;
}
JavafxTreeTabView(final BackgroundTaskRunner taskRunner,
final Node node, final TreeTabDisplay display)
{
super(node, display);
this.taskRunner = taskRunner;
}
@Override
public void loadTree(final ParseNode rootNode)
{ …
Run Code Online (Sandbox Code Playgroud) 运行这个简单的程序:
public static void main(final String... args)
{
System.out.println(BigDecimal.ZERO.scale());
System.out.println(new BigDecimal("0").scale());
System.out.println(new BigDecimal("0.0").stripTrailingZeros().scale());
System.out.println(new BigDecimal("1.0").stripTrailingZeros().scale());
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
0
1
0
Run Code Online (Sandbox Code Playgroud)
我的问题很简单:为什么不是第三个println
输出0
?那似乎合乎逻辑......
编辑:好的,所以,这是一个非常古老的错误:
事实上,它"适用于"任意数量的零:new BigDecimal("0.0000").stripTrailingZeroes().scale()
是4!
在我的所有项目中,我使用gradle并指定以下内容:
sourceCompatibility = "1.7"; // for example
targetCompatibility = "1.7"; // defaults to sourceCompatibility
Run Code Online (Sandbox Code Playgroud)
现在,我安装了三个不同版本的JDK,从1.6到1.8.为了从一个版本切换到另一个版本,我source
改变了shell文件PATH
,JAVA_HOME
甚至JDK_HOME
.
偶然可能会发生我使用错误的JDK版本而我不希望...在尝试任何编译任务之前是否有可能检查编译器版本是否等于targetCompatibility?
该Collections.singleton()
方法Set
使用该单个参数而不是a 返回a Collection
.
为什么会这样?从我所看到的,除了Set
作为一个子类型Collection
,我看不出任何优势......这只是因为无论如何Set
延伸Collection
所以没有理由不这样做?
是的,也有Collections.singletonList()
,但是这是另一回事,因为你可以从访问随机元素List
与.get()
...
通用专业化和值类型是未来JVM的预计特征; 链接到瓦尔哈拉项目页面在这里.
现在,根据我的理解,可以宣布:
final List<int> myList = new ArrayList<>(); // for instance
Run Code Online (Sandbox Code Playgroud)
但是接着List
定义了另一个.remove()
方法,除了在Collection
接口中定义的方法之外,它接受int
一个参数,它是要删除的列表中的索引; 这就是为什么,目前,list
以下示例中的内容:
final List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.remove(2);
Run Code Online (Sandbox Code Playgroud)
将是[1, 2]
和不[1, 3]
(选择最具体的过载).
但是,如果将来我们能够声明一个List<int>
,我们就会遇到一个问题:该remove
方法会选择多少重载?
我正在尝试一次声明和定义更大的哈希映射.我是这样做的:
public HashMap<Integer, Callable<String>> opcode_only = new HashMap<Integer, Callable<String>>() {{
put(x, y);
put(x, y);
}};
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在体内使用lambda表达式时put
,我正在进行eclipse warrning/error.这就是我在HashMap中使用lambda的方法:
public HashMap<Integer, Callable<String>> opcode_only = new HashMap<Integer, Callable<String>>() {{
put(0, () -> { return "nop"; });
put(1, () -> { return "nothing...."; });
}};
Run Code Online (Sandbox Code Playgroud)
Eclipse以逗号开头强调lambda的整个部分.错误消息:
Syntax error on token ",", Name expected
Syntax error on tokens, Expression expected instead
Run Code Online (Sandbox Code Playgroud)
有人知道我做错了什么吗?是否允许通过lambda表达式初始化HashMap
?请帮忙.
java ×10
java-8 ×3
collections ×2
bigdecimal ×1
enums ×1
generics ×1
gradle ×1
hashmap ×1
java-stream ×1
javac ×1
javafx ×1
lambda ×1
mockito ×1
testng ×1
unit-testing ×1
vi ×1