类型参数不在其绑定范围内



在这个类上运行maven compile时,我遇到了一个错误,但在执行时似乎工作得很好。我已经看了很多关于同一主题的其他帖子,但我自己无法做到这一点。

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和子类:

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编译器插件:2.5.1:compile(默认编译)项目测试:编译失败:编译故障:[ERROR]。。。\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不在其绑定内

我认为您不应该使用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给你一个ERROR,也许它被配置为将警告视为错误?请参阅Javac:将警告视为错误

第2版:运行此代码时,我总是会遇到错误。你是如何编译这些代码的?也许eclipse编译器(?)允许您运行这些代码?

第3版:根据这个问题的作者的说法,代码只在eclipse中运行。有时eclipse编译器的行为似乎有所不同,但在这种情况下,您应该将JDK视为命令(因为您的构建不是在eclipse中完成的,而是在带有javac的maven中完成的)。我不确定原因(当然可以在JLS中搜索),但为什么要混合类型边界和原始类型,这些类型只是为了与1.5之前的Java版本向后兼容而引入的?

eclipse和javac之间的泛型似乎还有其他区别:Maven编译器与eclipse编译器的泛型区别?

最新更新