Linux中的Java泛型错误,但Windows中没有
我有一个类可以在Windows中编译,但不能在Linux中编译。 不编译的方法是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> {
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调用方可能会,但并不局限于此。我认为您并不是在编译您认为您在该平台上的代码。