小编And*_*niy的帖子

私有接口方法的方法参考

请考虑以下代码:

public class A {
    public static void main(String[] args) {
        Runnable test1 = ((I)(new I() {}))::test;  // compiles OK
        Runnable test2 = ((new I() {}))::test;     // won't compile 
    }

    interface I {
        private void test() {}
    }
}
Run Code Online (Sandbox Code Playgroud)

我真的不明白......我明白这种test()方法是私密的.但是,如果我们将匿名类强制转换为其接口,会发生什么变化((I)(new I() {}))?更确切地说,我希望看到一个允许该技巧的特定JLS点.

PS我已将其报告为编译器的错误(ID:9052217).在我看来,Runnable test2 = ((new I() {}))::test;在这种特殊情况下应该编译得很好.

PPS到目前为止,根据我的报告创建了一个错误:https://bugs.openjdk.java.net/browse/JDK-8194998.它可能会被关闭为"不会修复"或者什么.

java language-lawyer java-9

24
推荐指数
4
解决办法
1943
查看次数

带有{}大括号的Spring MVC @Path变量

我正在使用弹簧靴开发应用程序.在REST控制器中,我更喜欢使用路径变量(@PathVariabale注释).我的代码获取路径变量,但它在网址中包含{}大括号.请任何人建议我解决这个问题

@RequestMapping(value = "/user/item/{loginName}", method = RequestMethod.GET)
public void getSourceDetails(@PathVariable String loginName) {
    try {
        System.out.println(loginName);
        // it print like this  {john}
    } catch (Exception e) {
        LOG.error(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

网址

http://localhost:8080/user/item/{john}
Run Code Online (Sandbox Code Playgroud)

输出控制器

{约翰}

java spring spring-mvc spring-boot

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

对于Thymeleaf的每个运营商

我找不到在Thymeleaf模板中构建简单for-each-loop的语法.我对just th:each=""属性不满意,因为它复制了它所在的标签.

我正在寻找的是:

<th:foreach th:each="...">
...block to be repeated...
</th>
Run Code Online (Sandbox Code Playgroud)

什么是模拟<c:forEach items="..." var="..."><t:loop source="..." value="...">Tapestry.有什么相似的吗?

foreach spring for-loop spring-mvc thymeleaf

23
推荐指数
2
解决办法
6万
查看次数

Java-8:boolean原始数组要流吗?

没有很好的方法可以在一个语句中将给定boolean[] foo数组转换为Java-8 中的流,或者我错过了什么?

(我不会问为什么?,但实际上是不可理解的:为什么不为所有原始类型添​​加流支持?)

提示: Arrays.stream(foo)不起作用,没有这种boolean[]类型的方法.

java java-8 java-stream

23
推荐指数
2
解决办法
7530
查看次数

类型变量的无关默认值继承错误:为什么?

免责声明:这不是关于这种情况(虽然错误听起来一样):class从类型java.util.Set和java.util.List继承spliterator()的无关默认值

这就是为什么:

考虑两个接口(在包" a"中)

interface I1 {
    default void x() {}
}

interface I2 {
    default void x() {}
}
Run Code Online (Sandbox Code Playgroud)

我绝对清楚为什么我们不能宣布这样的类:

abstract class Bad12 implements I1, I2 {
}
Run Code Online (Sandbox Code Playgroud)

(!)但我无法理解这种限制,参考类型变量:

class A<T extends I1&I2> {
    List<T> makeList() {
        return new ArrayList<>();
    }
}
Run Code Online (Sandbox Code Playgroud)

有错误:class java.lang.Object&a.I1&a.I2 inherits unrelated defaults for x() from types a.I1 and a.I2.

为什么我不能定义这样的类型变量?java在这种情况下,为什么要关心不相关的默认值?什么类型的变量可以"打破"?

更新:只是为了澄清.我可以创建几个类的表单:

class A1 implements I1, I2 {
    public void x() { …
Run Code Online (Sandbox Code Playgroud)

java type-variables java-8

22
推荐指数
1
解决办法
1611
查看次数

JVM什么时候决定重用旧的lambda?

请考虑以下代码片段:

public static Object o = new Object();

public static Callable x1() {
    Object x = o;
    return () -> x;
}

public static Callable x2() {
    return () -> o;
}
Run Code Online (Sandbox Code Playgroud)

方法x2()将始终返回相同的lamba对象,而x1()始终会创建新的对象:

    System.out.println(x1());
    System.out.println(x1());
    System.out.println(x2());
    System.out.println(x2());
Run Code Online (Sandbox Code Playgroud)

会打印出这样的东西:

TestLambda$$Lambda$1/821270929@4a574795
TestLambda$$Lambda$1/821270929@f6f4d33
TestLambda$$Lambda$2/603742814@7adf9f5f
TestLambda$$Lambda$2/603742814@7adf9f5f
Run Code Online (Sandbox Code Playgroud)

哪里(在JVM规范中我猜?)是描述了这种lambda重用规则?JVM如何确定重用与否?

java lambda jvm java-8

21
推荐指数
3
解决办法
923
查看次数

"___中的方法___()在无法访问的类或接口"编译错误中定义

我发现了一个奇怪的编译限制,我无法解释,我不明白这个限制的原因.

实施例-1:

考虑这些类:

package e1;:

public class C1 {
    enum E1 { A, B, C }
    public E1 x;
}
Run Code Online (Sandbox Code Playgroud)

package e2;:

import e1.C1;
public class C2 {
    public String test(C1 c1) {
        return c1.x.toString();    // here compilation error
    } 
}
Run Code Online (Sandbox Code Playgroud)

这会导致以下编译错误:

错误:(5,20)java:toString()in java.lang.Enum在无法访问的类或接口中定义

实施例-2:

考虑这些类:

package i1;:

public interface I1 {
    int someMethod();
}

public class C1 {
    static class I2 implements I1 {
        public int someMethod() {
            return 1; …
Run Code Online (Sandbox Code Playgroud)

java compiler-errors

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

为什么我不能直接将方法引用分配给Object类型的变量?

关于java-8语法的简单问题.为什么JLS-8限制这样的表达式:

Object of_ref = Stream::of;  // compile-time error
Run Code Online (Sandbox Code Playgroud)

并允许只有这样的东西:

java.util.function.Function of_ref = Stream::of;
Object obj = of_ref; // compiles ok
Run Code Online (Sandbox Code Playgroud)

java syntax java-8

20
推荐指数
4
解决办法
8102
查看次数

依赖默认字段初始化-编程风格不好吗?

我得到了指向官方Oracle文档的链接:https : //docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

据说:

默认值

声明字段时,不一定总是需要分配值。编译器会将已声明但未初始化的字段设置为合理的默认值。通常,此默认值将为零或null,具体取决于数据类型。但是,通常认为依赖于此类默认值是不好的编程风格。

我想强调这一部分:

但是,通常认为依赖于此类默认值是不好的编程风格。

但是,天哪,我想这是语言规范的基本组成部分,因为它知道实例变量具有默认值。如果即使在Java SE库源代码中也广泛使用它,那么到底为什么这是一种不好的编程习惯呢?

java instance-variables default-value

20
推荐指数
3
解决办法
763
查看次数

默认变量的值与初始化的默认值

我们都知道,根据JLS7第4.12.5节,每个实例变量都使用默认值进行初始化.例如(1):

public class Test {
    private Integer a;  // == null
    private int b;      // == 0
    private boolean c;  // == false
}
Run Code Online (Sandbox Code Playgroud)

但我一直认为,这样的类实现(2):

public class Test {
    private Integer a = null;
    private int b = 0;
    private boolean c = false;
}
Run Code Online (Sandbox Code Playgroud)

绝对等于例子(1).我预计,复杂的Java编译器会发现(2)中的所有这些初始化值都是冗余的并且省略了它们.

但突然之间,这两个类我们有两个不同的字节码.

例如(1):

   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return
Run Code Online (Sandbox Code Playgroud)

例如(2):

   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   aconst_null
   6:   putfield    #2; //Field a:Ljava/lang/Integer;
   9:   aload_0
   10:  iconst_0 …
Run Code Online (Sandbox Code Playgroud)

java bytecode compiler-optimization

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