请考虑以下代码:
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.它可能会被关闭为"不会修复"或者什么.
我正在使用弹簧靴开发应用程序.在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)
输出控制器
{约翰}
我找不到在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.有什么相似的吗?
没有很好的方法可以在一个语句中将给定boolean[] foo数组转换为Java-8 中的流,或者我错过了什么?
(我不会问为什么?,但实际上是不可理解的:为什么不为所有原始类型添加流支持?)
提示: Arrays.stream(foo)不起作用,没有这种boolean[]类型的方法.
免责声明:这不是关于这种情况(虽然错误听起来一样):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) 请考虑以下代码片段:
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如何确定重用与否?
我发现了一个奇怪的编译限制,我无法解释,我不明白这个限制的原因.
实施例-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()injava.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-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)
?
我得到了指向官方Oracle文档的链接:https : //docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
据说:
默认值
声明字段时,不一定总是需要分配值。编译器会将已声明但未初始化的字段设置为合理的默认值。通常,此默认值将为零或null,具体取决于数据类型。但是,通常认为依赖于此类默认值是不好的编程风格。
我想强调这一部分:
但是,通常认为依赖于此类默认值是不好的编程风格。
但是,天哪,我想这是语言规范的基本组成部分,因为它知道实例变量具有默认值。如果即使在Java SE库源代码中也广泛使用它,那么到底为什么这是一种不好的编程习惯呢?
我们都知道,根据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 ×9
java-8 ×4
spring ×2
spring-mvc ×2
bytecode ×1
for-loop ×1
foreach ×1
java-9 ×1
java-stream ×1
jvm ×1
lambda ×1
spring-boot ×1
syntax ×1
thymeleaf ×1