gpt4 book ai didi

java - 此代码使用 ecj 而不是 javac 进行编译。这是 ecj、javac 中的错误还是两者都不是?

转载 作者:搜寻专家 更新时间:2023-10-30 21:11:24 25 4
gpt4 key购买 nike

以下代码创建了一个Collector,它产生了一个UnmodifiableSortedSet:

package com.stackoverflow;

import java.util.Collections;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.stream.Collector;
import java.util.stream.Collectors;

public class SOExample {

public static <T extends Comparable<T>> Collector<T, ?, SortedSet<T>> toSortedSet() {
return Collectors.toCollection(TreeSet::new);
}

public static <T extends Comparable<T>> Collector<T, ?, SortedSet<T>> toUnmodifiableSortedSet() {
return Collectors.collectingAndThen(toSortedSet(), Collections::<T> unmodifiableSortedSet);
}
}

代码在ecj编译器下编译:

$ java -jar ~/Downloads/ecj-3.13.101.jar -source 1.8 -target 1.8 SOExample.java
Picked up _JAVA_OPTIONS: -Duser.language=en -Duser.country=GB

但是在 javac 下:

$ javac -version
Picked up _JAVA_OPTIONS: -Duser.language=en -Duser.country=GB
javac 1.8.0_73

$ javac SOExample.java
Picked up _JAVA_OPTIONS: -Duser.language=en -Duser.country=GB
SOExample.java:16: error: method collectingAndThen in class Collectors cannot be applied to given types;
return Collectors.collectingAndThen(toSortedSet(), Collections::<T> unmodifiableSortedSet);
^
required: Collector<T#1,A,R>,Function<R,RR>
found: Collector<T#2,CAP#1,SortedSet<T#2>>,Collection[...]edSet
reason: cannot infer type-variable(s) T#3
(actual and formal argument lists differ in length)
where T#1,A,R,RR,T#2,T#3 are type-variables:
T#1 extends Object declared in method <T#1,A,R,RR>collectingAndThen(Collector<T#1,A,R>,Function<R,RR>)
A extends Object declared in method <T#1,A,R,RR>collectingAndThen(Collector<T#1,A,R>,Function<R,RR>)
R extends Object declared in method <T#1,A,R,RR>collectingAndThen(Collector<T#1,A,R>,Function<R,RR>)
RR extends Object declared in method <T#1,A,R,RR>collectingAndThen(Collector<T#1,A,R>,Function<R,RR>)
T#2 extends Comparable<T#2>
T#3 extends Object declared in method <T#3>unmodifiableSortedSet(SortedSet<T#3>)
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ?
1 error

如果我将有问题的行更改为以下内容,代码将在两种编译器下编译:

return Collectors.collectingAndThen(toSortedSet(), (SortedSet<T> p) -> Collections.unmodifiableSortedSet(p));

这是 ecj、javac 中的错误还是允许这两种行为的规范不足?

Javac 在 Java 9 和 10 中的行为相同。

最佳答案

Oracle 已将此作为 compiler bug 接受.

关于java - 此代码使用 ecj 而不是 javac 进行编译。这是 ecj、javac 中的错误还是两者都不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49762791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com