私はこのようなメソッドを持つJava、中Either
の自家製の実装を使用しています:なぜこの分岐は型推論を中断しますか?
public static <L, R> Either<L, R> left(final L value);
public static <L, R> Either<L, R> right(final R value);
public <T> T fold(
final Function<? super L, ? extends T> leftFunction,
final Function<? super R, ? extends T> rightFunction);
これらの2つの方法は、コンパイルして正常に動作:
Either<Foo, Bar> rightToLeft() {
Either<Foo, Bar> input = Either.right(new Bar());
return input.fold(
l -> null,
r -> Either.left(new Foo())
);
}
Either<Foo, Bar> rightToRight() {
Either<Foo, Bar> input = Either.right(new Bar());
return input.fold(
l -> null,
r -> Either.right(new Bar())
);
}
このメソッドはコンパイルされません。 :
Either<Foo, Bar> rightToLeftOrRightConditionally() {
Either<Foo, Bar> input = Either.right(new Bar());
return input.fold(
l -> null,
r -> {
if (r.equals("x")) {
return Either.left(new Foo());
}
return Either.right(new Bar());
});
}
エラー:
incompatible types: inferred type does not conform to upper bound(s)
inferred: Either<? extends Object,? extends Object>
upper bound(s): Either<Foo,Bar>,java.lang.Object
(私はエラーを読みやすくするために、パッケージ修飾子をトリミングしました)
私はそれが種類を指定してコンパイルすることができます:
if (r.equals("x")) {
return Either.<Foo, Bar> left(new Foo());
}
return Either.<Foo, Bar> right(new Bar());
しかし、なぜ私が必要なのでしょうか?そして、どのように私はこのコードの混乱を避けることができますか?
コンパイラが混乱するためですか? 'left'と' right'のコードを投稿するべきです –
@RC。私は 'left()'と 'right() 'の署名を追加しました – slim
再現できません。これは 'javac'とeclipseの両方で、うまくコンパイルされます。 –