Linux中的Java泛型错误,但Windows中没有

Linux中的Java泛型错误,但Windows中没有,java,generics,Java,Generics,我有一个类可以在Windows中编译,但不能在Linux中编译。 不编译的方法是mapA。 我得到的错误是:“错误:类型参数B不在类型变量B的范围内”。 为什么Windows接受我的代码而Linux不接受? 我能以某种方式禁用此错误吗 这是一节课: /** Either an A or a B. C is some common supertype of A and B. */ public class EitherOr<C, A extends C, B extends C> {

我有一个类可以在Windows中编译,但不能在Linux中编译。 不编译的方法是
mapA
。 我得到的错误是:“错误:类型参数B不在类型变量B的范围内”。 为什么Windows接受我的代码而Linux不接受? 我能以某种方式禁用此错误吗

这是一节课:

/** Either an A or a B. C is some common supertype of A and B. */
public class EitherOr<C, A extends C, B extends C>
{
    private final boolean isA;
    private final A a;
    private final B b;

    protected EitherOr(boolean isA, A a, B b)
    {
        this.isA = isA;
        this.a = a;
        this.b = b;
    }

    /**
     * If f(A) is of type D,
     * maps an EitherOr<C, A, B> to an EitherOr<E, f(A), B>,
     * where E is some common supertype of D and B.
     */
    public<E, D extends E> EitherOr<E, D, B> mapA(Function<A, D> f)
    {
        return (EitherOr<E, D, B>)(isA ? ofA(f.apply(a)) : ofB(b));
    }

    /** Creates an EitherOr<C, A, B> which is actually an A */
    public static<C, A extends C, B extends C> EitherOr<C, A, B> ofA(A a) {...}

    /** Creates an EitherOr<C, A, B> which is actually a B */
    public static<C, A extends C, B extends C> EitherOr<C, A, B> ofB(B b) {...}

    /** If is A, returns a, else throws an exception. */
    public A getA() {...}

    /** If is B, returns b, else throws an exception. */
    public B getB() {...}

    public C getValue() {return isA ? a : b;}

    ...
}
/**A或B.C是A和B的一些常见超类型*/
公共类EitherOr
{
私有最终布尔isA;
私人决赛A;
私人决赛B;
受保护EitherOr(布尔isA,A,B)
{
这是isA=isA;
这个a=a;
这个.b=b;
}
/**
*如果f(A)为D型,
*将EitherOr映射到EitherOr,
*其中E是D和B的一些常见超型。
*/
公共EitherOr mapA(功能f)
{
返回(EitherOr)(isA?ofA(f.apply(a)):ofB(b));
}
/**创建一个实际为A的EitherOr*/
公共静态EitherOr of A(A){…}
/**创建一个实际为B的EitherOr*/
公共静态EitherOr of B(B){…}
/**如果是A,则返回A,否则抛出异常*/
公共A getA(){…}
/**如果是B,则返回B,否则抛出异常*/
公共B getB(){…}
公共C getValue(){return isA?a:b;}
...
}
因此(在添加
import java.util.function.*;
后,将
..
s替换为
return null;
s)的空行错误为:

Main.java:22: error: type argument B is not within bounds of type-variable B
    public<E, D extends E> EitherOr<E, D, B> mapA(Function<A, D> f)
                                      ^
  where B,C are type-variables:
    B extends C declared in class EitherOr
    C extends Object declared in class EitherOr
Main.java:22:错误:类型参数B不在类型变量B的范围内
公共EitherOr mapA(功能f)
^
其中B、C为类型变量:
B扩展类EitherOr中声明的C
C扩展类EitherOr中声明的对象
听起来很合理
B
不一定扩展
E
,这是必需的。它确实扩展了
C
,但这并不相关

演员阵容是问题的另一个迹象


如果此代码在任何编译器上编译,则该编译器存在重大问题。

错误在哪里?在方法签名上,还是在方法中?我高度怀疑Windows和Linux中的代码不一样。注意:最好将条件表达式编写为显式
if/else
。那里的类型推断很可能有点毛茸茸的(正如演员阵容所证明的)。@m0skit0:或者编译器的生成或设置是不同的。我怀疑这里的
C
的值。我看到它被用作
getValue()
方法的返回值;但是相对于静态方法
staticcgetvalue,它需要携带很多额外的语法包袱(另一方面,人们总是可以用
Object
代替
E
作为
B
D
的普通超类。在这种情况下,您可能会接受此代码为有效代码,这就是我认为Windows编译器所做的。我想可能有一些命令行选项用于
javac
来指定explic这就是如何解释此类代码的问题。@roel调用方可能会,但并不局限于此。我认为您并不是在编译您认为您在该平台上的代码。