Пытаюсь сделать библиотечку парсер комбинаторов для того, чтобы парсить JSON.
public static <R, T> Parser<R, T> oneOf(final Parser<? extends R, T>... parsers) {
return new Parser<R, T>() {
@Override
public ParseResult<R> parse(TokenStream<T> tokenStream) {
for (Parser<? extends R, T> parser : parsers) {
final TokenStream.Marker marker = tokenStream.newMarker();
final ParseResult<? extends R> result = parser.parse(tokenStream);
if (result.isSuccessful()) {
marker.forget();
return result; //incompatible types
// found : ch.abacus.search.client.remote.query.parser.ParseResult<capture#204 of ? extends R>
// required: ch.abacus.search.client.remote.query.parser.ParseResult<R>
} else {
marker.back();
}
}
return new ParseResult.Failure<R>("Expected one of");
}
};
}
public interface Parser<R, T> {
ParseResult<R> parse(TokenStream<T> tokenStream);
}
public interface ParseResult<R> {
boolean isSuccessful();
R getResult();
String getErrorMessage();
static class Success<R> implements ParseResult<R> {
...
}
static class Failure<R> implements ParseResult<R> {
...
}
}
Как бы сделать, чтоб нормально тайпчекалось?