LINUX.ORG.RU

[Java][Generics]Как правильно описать ковариантность?

 ,


0

1

Пытаюсь сделать библиотечку парсер комбинаторов для того, чтобы парсить 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> {
...
    }
}

Как бы сделать, чтоб нормально тайпчекалось?

★★★

Последнее исправление: pitekantrop (всего исправлений: 1)
Ответ на: комментарий от dizza

> Добавь приведение "(ParseResult<R>)" и не парься.

Это понятно. Но интересно, можно ли сделать по-нормальному или нет?

pitekantrop ★★★
() автор топика

Т.е. ParseResult ковариантен параметру типа R. Но как бы это записать?

pitekantrop ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.