Тип Параметр не находится в пределах его границ

Я получаю сообщение об ошибке при запуске компиляции maven в этом классе, но, похоже, при выполнении он работает нормально. Я просмотрел довольно много других сообщений по той же теме, но не смог заставить это работать для себя.

EDIT – удалены исходные фрагменты кода и заменены

EDIT – Предоставление MCVE — очень урезано

Кстати, это работает на Java 6

public class MainTester {

    @SuppressWarnings("rawtypes")
    public static void main(String[] args) {
        ProtocolHandler<MappingRule> mappingProtocolHandler = new MappingProtocolHandler();

        Map<String, List<MappingRule>> protocols = mappingProtocolHandler.getProtocols();

        System.out.println(protocols);
    }

}

Класс ProtocolHandler и Child:

public abstract class ProtocolHandler<E extends Rule<?, ?>> {
    public Map<String, List<E>> getProtocols() {                
            return getProtocolsForRequest();
    }

    protected abstract Map<String, List<E>> getProtocolsForRequest();
}

@SuppressWarnings("rawtypes")
public class MappingProtocolHandler extends ProtocolHandler<MappingRule>{
    @Override
    protected Map<String, List<MappingRule>> getProtocolsForRequest() {

        return new HashMap<String, List<MappingRule>>();
    }
}

Классы правил:

public interface Rule<F, T> {
    public void execute(F object, T object2);
}

public abstract class BaseRule<F, T> implements Rule<F, T>, Comparable<BaseRule<F, T>> {

}

public abstract class MappingRule<F,T> extends BaseRule<F, T> implements CustomAttributes{

}

public abstract class InputRule extends MappingRule<Object, Map<String,Object>> {

}

public abstract class OutputRule extends MappingRule<Map<String, Object>, Object> {

}

public interface CustomAttributes {

}

Классы обработчиков:

public abstract class ProtocolHandler<E extends Rule<?, ?>> {
    public Map<String, List<E>> getProtocols() {                
            return getProtocolsForRequest();
    }

    protected abstract Map<String, List<E>> getProtocolsForRequest();
}

@SuppressWarnings("rawtypes")
public class MappingProtocolHandler extends ProtocolHandler<MappingRule>{
    @Override
    protected Map<String, List<MappingRule>> getProtocolsForRequest() {

        return new HashMap<String, List<MappingRule>>();
    }
}

[ОШИБКА] Не удалось выполнить цель org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-compile) в проекте Test: Ошибка компиляции: Ошибка компиляции: [ОШИБКА]...\src\ main\java\common\main\MainTester.java:[14,18] параметр типа common.mapping.rule.MappingRule не находится в пределах своей границы [ERROR]...\src\main\java\common\handler\MappingProtocolHandler. Параметр типа java:[10,60] common.mapping.rule.MappingRule не находится в пределах его границ


person bhcmoney    schedule 24.06.2015    source источник
comment
Что такое ProtocolHandler? Можете ли вы показать объявление класса, которое содержит это поле и метод?   -  person Sotirios Delimanolis    schedule 24.06.2015
comment
MappingRule — это общий тип (с параметрами), но вы используете его необработанный.   -  person Seelenvirtuose    schedule 24.06.2015
comment
Я добавил ProtocolHandler в исходное сообщение. И я не могу использовать его сырым все еще?   -  person bhcmoney    schedule 24.06.2015
comment
Покажите нам класс, который объявляет поле mappingProtocolHandler.   -  person Sotirios Delimanolis    schedule 24.06.2015
comment
оригинальный пост в разделе редактирования, спасибо   -  person bhcmoney    schedule 24.06.2015
comment
Я скопировал ваш код и не могу воспроизвести вашу проблему. Пожалуйста, предоставьте MCVE.   -  person Sotirios Delimanolis    schedule 24.06.2015
comment
Добавил полный пример выше   -  person bhcmoney    schedule 24.06.2015
comment
Ваш пример отлично компилируется для меня.   -  person Sotirios Delimanolis    schedule 24.06.2015
comment
Используя как java 1.6, так и 1.7, я, похоже, все еще получаю type argument MappingRule is not within bounds of type-variable E, но он работает нормально, и Spring Source Tool Suite не показывает ошибок компиляции в коде.   -  person bhcmoney    schedule 24.06.2015
comment
взгляните @ stackoverflow.com/questions/4775365/   -  person Uday Shankar    schedule 24.06.2015


Ответы (1)


Я думаю, вам не следует использовать необработанный тип MappingRule

private ProtocolHandler<MappingRule> mappingProtocolHandler;

public void execute(){
 Map<String, List<MappingRule>> protocols =  mappingProtocolHandler.getProtocols(protocolExecutionRequest);
}

но

private ProtocolHandler<MappingRule<String, String>> mappingProtocolHandler;

public void execute(){
    Map<String, List<MappingRule<String, String>>> protocols = mappingProtocolHandler.getProtocols(/**/);
}

РЕДАКТИРОВАТЬ: если только maven выдает вам ОШИБКУ, может быть, он настроен на обработку предупреждений как ошибок? см. Javac: обрабатывать предупреждения как ошибки

EDIT2: я всегда получаю ошибки при запуске этого кода. Как вы компилируете этот код? Может быть, компилятор eclipse (?) В любом случае позволяет вам запускать этот код?

EDIT3: По словам автора вопроса, код работает только в eclipse. Иногда кажется, что компилятор eclipse ведет себя по-другому, но в этом случае вы должны рассматривать JDK как императив (поскольку ваша сборка выполняется не в eclipse, а в maven с javac). Я не уверен в причине (можно, конечно, поискать JLS для этого), но зачем смешивать границы типов и необработанные типы, которые были введены только для обратной совместимости с версиями Java до 1.5?

Кажется, есть и другие различия в дженериках между eclipse и javac: Maven Compiler vs Eclipse Compiler Отличие дженериков?

person user140547    schedule 24.06.2015
comment
Я пытался определить только один ProtocolHandler против одного для каждого типа MappingRule. - person bhcmoney; 24.06.2015
comment
Что ж, MappingRule — это общий тип, поэтому необходимо предоставить некоторую информацию о типе, я обновил свой пост, например, с помощью <String,String> - person user140547; 24.06.2015
comment
Я понимаю, что это общий, но разве вы не можете использовать их как необработанные типы, например, с List testList = new ArrayList();, который является общим и выдает вам предупреждения, но все же подходит для использования в большинстве контекстов? - person bhcmoney; 24.06.2015
comment
просто в eclipse он автоматически создается и позволяет мне использовать его без проблем - person bhcmoney; 24.06.2015