javac:不兼容的类型:Mono <object>无法转换

时间:2018-07-16 21:12:45

标签: java eclipse maven mono project-reactor

有人可以解释为什么mono1()方法在Eclipse中没有显示错误,并且可以在Eclipse中运行,但是不能与Maven或javac一起编译吗?为什么在Eclipse和Maven / mono2()中都可以使用javac方法呢?

import java.util.function.Function;

import lombok.AllArgsConstructor;
import lombok.Data;
import reactor.core.publisher.Mono;

public class IncompatibleTypes {
    public static void main(String[] args) {
        mono1().doOnNext(a -> System.out.println("mono1: " + a)).subscribe();
        mono2().doOnNext(a -> System.out.println("mono2: " + a)).subscribe();
    }

    static Mono<A> mono1() {
        return Mono.just("mono1")
                .flatMap(flatMapper(A.class))
                .doOnError(System.err::println); // Maven/javac errors on this line
                                                 // Eclipse is fine with it
    }

    static Mono<A> mono2() {
        Mono<A> mono = Mono.just("mono2")
                .flatMap(flatMapper(A.class)); // compiles fine in Eclipse, Maven, javac
        mono = mono.doOnError(System.err::println);
        return mono;
    }

    static <R> Function<? super String, ? extends Mono<? extends R>> flatMapper(Class<R> clazz) {
        return (str) -> {
            A a = new A(str);
            return Mono.just((R) a);
        };
    }

    @Data
    @AllArgsConstructor
    static class A {
        private String name;
    }
}

这是来自Maven和/或javac的错误:

IncompatibleTypes.java:16: error: incompatible types: Mono<Object> cannot be converted to Mono<A>
                .doOnError(System.err::println);

doOnError()应该返回Mono<T>,在我的示例中,T不应为Object

Eclipse中没有错误,当我将鼠标悬停在Eclipse上的doOnError上时,它显示了预期的Mono<A>类型(而不是Mono<Object>):

enter image description here

  • Eclipse版本:Spring Tools Suite版本:3.9.5.RELEASE。
  • Maven版本:3.5.0
  • maven-compiler-plugin :3.7.0
  • javac版本:1.8.0_171

0 个答案:

没有答案