相关疑难解决方法(0)

Java 8 Streams:为什么Collectors.toMap对于带有通配符的泛型有不同的行为?

假设你有一个List数字.在该值List可以是类型的Integer,Double等等.当你声明这样的List有可能使用一个通配符(声明它?)或不用一个通配符.

final List<Number> numberList = Arrays.asList(1, 2, 3D);
final List<? extends Number> wildcardList = Arrays.asList(1, 2, 3D);
Run Code Online (Sandbox Code Playgroud)

所以,现在我想streamListcollect它所有的Map使用Collectors.toMap(显然下面的代码只是为了说明问题的例子).让我们开始流式传输numberList:

final List<Number> numberList = Arrays.asList(1, 2, 3D, 4D);

numberList.stream().collect(Collectors.toMap(
        // Here I can invoke "number.intValue()" - the object ("number") is treated as a Number
        number -> Integer.valueOf(number.intValue()),
        number -> number));
Run Code Online (Sandbox Code Playgroud)

但是,我不能对以下内容做同样的操作wildcardList:

final List<? extends Number> wildCardList …
Run Code Online (Sandbox Code Playgroud)

java generics lambda java-8 collectors

27
推荐指数
1
解决办法
2万
查看次数

Java泛型捕获列表<?>

我正在查看Java Generics文档并找到这段代码,

public class WildcardError {

void foo(List<?> l) {
    //This give a compile time error
    l.set(0,l.get(0));
}
}
Run Code Online (Sandbox Code Playgroud)

我可以理解,我们从a中获取一个元素List<?>并尝试将其设置为另一个元素List<?>.所以编译器会出错.我的问题是,当2个列表不同时,l.set(0, m.get(0))这里列出l并且m不同,这是有道理的.但在上面的例子中,ll列表相同.为什么编译器不够聪明才能看到它?实施起来难吗?

编辑:我知道我可以通过辅助方法或使用T而不是使用?.来修复它.只是想知道为什么编译器不会为我做这件事.

java generics

5
推荐指数
2
解决办法
5020
查看次数

使用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 ×3

generics ×2

collectors ×1

java-8 ×1

lambda ×1

typeerror ×1