小编fge*_*fge的帖子

为什么枚举值不能在switch语句中完全限定?

(注:编辑问题;先前意图不明确)

考虑以下代码:

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:枚举开关案例标签必须是枚举常量的非限定名称

SO 建议从JLS的引用中得到答案:

(需要内联常量的一个原因是switch语句在每种情况下都需要常量,并且没有两个这样的常量值可能是相同的.编译器在编译时检查switch语句中的重复常量值;类文件格式不做案例值的象征性联系.)

但这并不能让我满意.就我而言,VALUE1并且X.VALUE1完全一样.引用的文字对我来说根本没有解释.

在JLS中定义语句中的enumswitch是否必须以这种方式写入?

java enums

21
推荐指数
1
解决办法
7236
查看次数

枚举,接口和(Java 8)lambdas:代码编译但在运行时失败; 这是预期的吗?

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 type-inference java-8

21
推荐指数
1
解决办法
1303
查看次数

Java 8`Stream`可以并行,你甚至不需要它吗?

在我看来,明显的代码,当使用Java 8时Stream,无论它们是"对象"流还是原始流(即IntStream和朋友)都只是使用:

someStreamableResource.stream().whatever()
Run Code Online (Sandbox Code Playgroud)

但是,相当多的"可流动资源"也有.parallelStream().

读取javadoc时不清楚的是.stream()流是否始终是顺序的,以及.parallelStream()流是否始终是并行的...

然后有Spliterator,特别是它.characteristics(),其中一个是它可以CONCURRENT,甚至IMMUTABLE.

我的直觉是,事实上,Stream默认情况下是否可以并行,或者根本不是并行,是由其潜在的Spliterator...

我是在正确的轨道上吗?我已经阅读并再次阅读了javadocs,但仍然无法对这个问题做出明确答案......

java java-8 java-stream

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

你如何模拟JavaFX工具包初始化?

[序言:道歉,这里有很多代码,其中一些可能与这个问题无关,而一些理解问题所必需的代码可能会丢失; 请评论,我会相应地编辑问题.]

环境: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)

java testng unit-testing javafx mockito

18
推荐指数
1
解决办法
3160
查看次数

为什么新的BigDecimal("0.0").stripTrailingZeros()的比例为1?

运行这个简单的程序:

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!

java bigdecimal

17
推荐指数
1
解决办法
6844
查看次数

使用Java删除BOM字符

使用Java作为vis 的等价物需要发生什么

:set nobomb
Run Code Online (Sandbox Code Playgroud)

假设BOM来自我正在阅读的文件.

java vi byte-order-mark

17
推荐指数
2
解决办法
3万
查看次数

如何使用gradle强制执行java编译器版本?

在我的所有项目中,我使用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?

java javac gradle

17
推荐指数
2
解决办法
9407
查看次数

Collections.singleton()返回Set而不是Collection的好处是什么?

Collections.singleton()方法Set使用该单个参数而不是a 返回a Collection.

为什么会这样?从我所看到的,除了Set作为一个子类型Collection,我看不出任何优势......这只是因为无论如何Set延伸Collection所以没有理由不这样做?

是的,也有Collections.singletonList(),但是这是另一回事,因为你可以从访问随机元素List.get()...

java collections

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

Java 9或更高版本中的预计泛型专业化,与List <int>:.remove()将如何工作?

通用专业化和值类型是未来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方法会选择多少重载?

java generics project-valhalla

15
推荐指数
1
解决办法
531
查看次数

Java 8:使用lambda表达式初始化HashMap

我正在尝试一次声明和定义更大的哈希映射.我是这样做的:

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 collections lambda hashmap java-8

14
推荐指数
1
解决办法
2万
查看次数