我的java代码中有以下测试类:
Function<? super Either<? extends Object, ? extends Object>, ? super Either<? extends Object, ? extends Object>> test = new Function<Either<Integer, Integer>, Either<Integer, Integer>>() {
@Override
public Either<Integer, Integer> apply(Either<Integer, Integer> integers) {
return integers;
}
}两者的文档都可以在这里找到:http://static.javadoc.io/io.javaslang/javaslang/2.0.2/javaslang/control/Either.html。
但是我得到了以下编译错误(Java 8)
Error:(77, 129) java: incompatible types:
<anonymous java.util.function.Function<javaslang.control.Either<java.lang.Integer,java.lang.Integer>,javaslang.control.Either<java.lang.Integer,java.lang.Integer>>>
cannot be converted to
java.util.function.Function<? super javaslang.control.Either<? extends java.lang.Object,? extends java.lang.Object>,? super javaslang.control.Either<? extends java.lang.Object,? extends java.lang.Object>>我是Java新手,不知道这里出了什么问题。任何帮助都是非常感谢的。
我知道这段代码没有意义,这也不是我真正使用它的方式。我实际上是在尝试将一个函数传递给一个内部库。但我不应该得到编译错误,其中任何一个都不能转换为?超级任一
谢谢!!
发布于 2017-02-20 17:36:57
它不工作的原因是因为? super Either<? extends Object, ? extends Object> (相当于? super Either<?, ?>)必须能够接受任何类型的Either。例如,必须编译以下代码
Either<Long, Long> either = ...
test.apply(either);因为Either<Long, Long>是Either<?, ?>的子类。但是您的实现只能处理一个特定子类型:Either<Integer, Integer>。
下面是同一问题的一个更简单的演示:
Lis<? super Number> numbers = new ArrayList<Integer>();这不会编译,因为列表必须是可以接受任何Number的类型,而不仅仅是Integer。
对于您的情况,理想的解决方案取决于您到底想要做什么,这一点从问题中并不完全清楚。我能得到的最接近你的尝试是:
Function<? super Either<Integer, Integer>, ? extends Either<?, ?>> test = ...注意在第一个参数中使用super,在第二个参数中使用extends。这遵循了Producer extends, Consumer super的原则。
https://stackoverflow.com/questions/42339940
复制相似问题