相关疑难解决方法(0)

在Java 8中使用三元运算符进行泛型编译错误,但在Java 7中没有

这个类在Java 7中编译好,但在Java 8中没编译:

public class Foo {

    public static void main(String[] args) throws Exception {
        //compiles fine in Java 7 and Java 8:
        Class<? extends CharSequence> aClass = true ? String.class : StringBuilder.class;
        CharSequence foo = foo(aClass);

        //Inlining the variable, compiles in Java 7, but not in Java 8:
        CharSequence foo2 = foo(true ? String.class : StringBuilder.class);

    }

    static <T> T foo(Class<T> clazz) throws Exception {
        return clazz.newInstance();
    }
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

错误:(9,29)java:类Foo中的方法foo不能应用于给定的类型; required:java.lang.Class发现:true?Str [...]类
原因:推断类型不符合推断的等式约束:java.lang.StringBuilder等式约束:java.lang.StringBuilder,java.lang.String

为什么这在Java 8中停止工作?是故意/某些其他功能的副作用,还是仅仅是编译器错误?

java generics java-8

31
推荐指数
2
解决办法
6176
查看次数

使用javac 8编译代码时使用javac 6可以正常编写Java类型错误

我有这个类,这是我在从Java 6移植到Java 8的项目中找到的一些代码的简化:

public class Unification {

    final class Box<A> {}

    final class MyMap<A, B extends Box<? extends A>> {}

    MyMap<?, ?> getMap() {
        return new MyMap<Object, Box<Object>>();
    }

    <A, B extends Box<? extends A>> void setMap(final MyMap<A, B> m) {}

    void compileError() {
        setMap(getMap());
    }

}
Run Code Online (Sandbox Code Playgroud)

这只是一个非常小的例子来展示问题,实际的代码更有意义.这个问题似乎很普遍,因此是一个抽象的例子.核心问题如下:由于某种原因,javac不希望接受带有类型MyMap<?, ?>作为setMap()方法参数的表达式,即使根据我的理解,这应该是良好类型的.

代码使用javac 6编译时没有错误,但是当我使用javac 8时,我得到了这个不起眼的错误消息:

C:\System9\KWS_sparse\sourcesNG\Domain\src\uz\Unification.java (21:9) error: method setMap in class Unification cannot be applied to given types;
required: Unification.MyMap<A,B>
found: Unification.MyMap<CAP#1,CAP#2>
reason: inference variable A has incompatible …
Run Code Online (Sandbox Code Playgroud)

java typeerror

5
推荐指数
1
解决办法
127
查看次数

标签 统计

java ×2

generics ×1

java-8 ×1

typeerror ×1