Tag: 语言 律师

如果将结果数组分配给变量,它是否为匿名数组

(我正在攻读Java助理考试OCJP 7) 一个问题要求选择非法初始化的例子。 其中一个答案是: – int [] k= new int[2]{5,10}; 解释说,在创建匿名数组时,指定数组的大小是非法的。 据我所知,这不是一个匿名数组,因为它被命名为“k”。 调用如下方法: – operateOnArray(new int[]{5,10}); 本来是一个匿名数组的例子,因为它没有被声明。 我可以看到“2”使其成为非法 – 但这并不是匿名的, 有人可以告诉我吗?

私有接口方法的方法参考

请考虑以下代码: 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() {} } } 我真的不明白……我明白test()方法是私有的 。 但是如果我们将匿名类转换为其接口((I)(new I() {}))会有什么变化? 更准确地说,我希望看到一个允许该技巧的特定JLS点。 PS我已将其报告为编译器的错误(ID:9052217)。 在我看来, Runnable test2 = ((new I() {}))::test; 应该在这种特殊情况下编译好。 PPS到目前为止,根据我的报告创建了一个错误: […]

在原始类类型上忽略显式方法类型参数; 编译bug?

我在调用带有显式类型参数的generics方法时遇到编译器错误,就好像未考虑显式类型参数一样。 最小的例子: class CastExample { static class ThingProducer { public T getThing() { return null; } } static class ThingA {} public static void main(String… args) { ThingProducer thingProducer = new ThingProducer(); ThingA thingA = thingProducer.getThing(); // compile error here } } ThingProducer是一个原始类型,因为类有一个类型参数,但在调用getThing我们没有引用类类型参数,而是提供方法类型参数。 根据我对JLS的理解,这应该是合法的,但它给了我这个错误: incompatible types: Object cannot be converted to ThingA 如果我,错误消失 从ThingProducer删除 或使getThing静态 […]

为什么类不能扩展其中出现的静态嵌套类?

这个class: public class OuterChild extends OuterChild.InnerParent { public static class InnerParent { } } 无法编译: $ javac OuterChild.java OuterChild.java:1: error: cyclic inheritance involving OuterChild public class OuterChild extends OuterChild.InnerParent { ^ 1 error 因为OuterChild会“依赖”它本身,因为( 根据Java语言规范 ,Java SE 8版的§8.1.4“超类和子类” )类直接依赖于“[]中提到的任何类型的extends或implements子句[…]作为超类或超界面名称的完全限定forms的限定符。“ 但我真的不明白这里的动机。 什么是有问题的依赖? 它只是为了与InnerParent是非static的情况保持一致(并因此最终得到一个词法封闭的自身实例)?

Java7规范中的语法是否真的相同?

JLS v7 第18章中的语法似乎与文档中其他地方的结构不同,但对我来说似乎存在差异。 特别是在第15章中,规则是: RelationalExpression: ShiftExpression RelationalExpression ShiftExpression RelationalExpression = ShiftExpression RelationalExpression instanceof ReferenceType 这使得foo instanceof Bar成为一个RelationalExpression(因此是一个EqualityExpresson),它又可以在EqualityExpression规则中用作LHS,这使得foo instanceof Bar == false为EqualityExpression。 但是在第18章中查看语法时,他们对它进行了简化: Expression2: Expression3 [Expression2Rest] Expression2Rest: { InfixOp Expression3 } instanceof Type 这看起来很奇怪,这意味着我们可以将Expression3与二元运算符链接在一起,或者我们可以检查一个Expression3的类型。 具体来说,现在foo instanceof Bar是一个Expression2 ,但我没有看到使用Expression2作为相等比较的LHS是有效的。 我是否错过了第18章语法中的一些内容,使得foo instanceof Bar == false是一个有效的表达式? 请注意,根据第15章中的规则并根据我的编译器,它是一个有效的表达式。

(编译器)否则if(true)vs else scenario

获取以下Java代码段: …. else if (true){ //hard-coded as true ///launch methodA } else { ///launch methodA (same code as in the ` else if ` statement) } …. 我想知道的是编译器如何处理这个问题。 编译器完全删除else if(true)语句以便不必执行检查是不合逻辑的,即使它被硬编码为true。 特别是在Eclipse中,上面的代码是如何解释的? 或者在以下场景中如何: …. else if (true){ //hard-coded as true ///launch methodA } else { ///launch methodBB } …. 在这种情况下,编译器删除else语句不是合乎逻辑的吗? 因为在运行时, else语句无法访问。

Java:使用“this”作为实例方法的参数/参数名称?

最近从这个问题我得知以下似乎是合法的java: class Bar { void foo(Bar this) {} } 现在,我试图找到java标准中的哪个位置,它表示你可以这样做,并且看了一下,但我找不到该部分。 有人可以引用它允许这种forms的方法声明的地方,以及声明一个名为this的参数的限制是什么?