Tag: 类型推断

generics类型推断失败了吗?

例A 研究以下片段: public class ExampleA { static class Pair { } static Pair anyPair() { return null; } static void process(Pair p1, Pair p2) { return; } public static void main(String[] args) { Pair p = anyPair(); process(p, anyPair()); // doesn’t compile } } 有人可以解释为什么类型推断适用于局部变量p的赋值但不适用于要process的第二个实际参数吗? 例B 这可能更容易理解: public class ExampleB { public static void process(Set […]

JDK 7中的类型推断比JDK 6更具限制性吗?

我认为这可能与为什么List的通用演员有关? 扩展Set ..>到List 在Sun JDK 6上成功但在Oracle JDK 7上无法编译? 如果我们采用以下类,它们在JDK 6下编译正常: public final class Foo { private final V value; private Foo(final V value) { this.value = value; } public static Foo of(final R value) { return new Foo(value); } } final class Tester { @Test(groups=”unit”) public static void test() { bar(Foo.of(BigDecimal.ZERO)); // This line fails […]

为什么直接将Arrays.asList()分配给var时会出现AssertionError?

我试图理解Java 10中的局部变量类型推断 。 下面的代码在编译和运行时完美运行: List list1 = Arrays.asList(1L, 2.0F, “3”); var list2 = list1; 但是,此行会引发编译错误: var list3 = Arrays.asList(1L, 2.0F, “3”); Error:java: java.lang.AssertionError: Unexpected intersection type: java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable> 我真的不明白为什么第二种情况是错误的但不是第一种情况。 因为我希望编译器可以推断出list1的类型,并且对list2和list3进行相同的处理。 提前致谢。

局部变量的Java 10类型推断可以推断出无效吗?

使用Java 10,我们可以使用类型推断。 String s1 = “hello”; // before Java 10 var s2 = “hello”; // now 但是,有一件事我们以前做不到:有类型为void的变量。 因此,在以前的版本中,我们根本无法定义变量类型void 。 但是现在我们可以将返回void的方法的结果赋给变量: void emptyMethod() { } … void v1 = emptyMethod(); // won’t compile var v2 = emptyMethod(); // no problem at all 问题是 – 它为什么甚至编译,它的目的是什么? 你有这个奇怪的用例吗? void类型的变量没有方法,它甚至不能用作方法的参数。

为什么不能在匿名内部类上使用菱形推断类型?

在Java 7及更高版本中,菱形可用于正常推断类型,因此没有问题: List list = new ArrayList(); 但是,对于像这样的匿名内部类,它不能: List st = new List() { //Doesn’t compile //Implementation here } 为什么是这样? 从逻辑上讲,在这种情况下,我绝对可以将类型推断为String 。 这个决定的逻辑原因是,在匿名内部类中实际上不能推断出类型,还是由于其他原因而省略了?

为什么javac不能推断用作参数的函数的generics类型参数?

在下面的示例中,为什么编译器能够在Foo.create()中推断第一次调用Foo.create()的generics参数,但在第二次调用Foo.create()无法这样做? 我正在使用Java 6。 public class Nonsense { public static class Bar { private static void func(Foo arg) { } } public static class Foo { public static Foo create() { return new Foo(); } private static void test() { Foo foo2 = Foo.create(); // compiles Bar.func(Foo.create()); // won’t compile Bar.func(Foo.create()); // fixes the prev line […]

枚举,接口和(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); } } 这段代码编译; 但它在运行时失败: Exception in thread “main” java.lang.BootstrapMethodError: call […]