类型参数不符合其限制。

4
我在运行maven编译此类时遇到了错误,但在执行时似乎可以正常工作。我查看了很多与此主题相关的帖子,但无法使其正常工作。 编辑 - 删除原始代码段并替换 编辑 - 提供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 不在其范围内

请展示声明了 mappingProtocolHandler 字段的类。 - Sotirios Delimanolis
原帖正在编辑中,谢谢。 - mstelz
我复制了你的代码,但无法重现你的问题。请提供一个最小可复现示例(MCVE)。 - Sotirios Delimanolis
使用Java 1.6和1.7,我似乎仍然会得到“类型参数MappingRule不在类型变量E的范围内”的错误,但它可以正常运行,Spring Source Tool Suite在代码中也没有显示任何编译错误。 - mstelz
请查看此链接:https://dev59.com/xlPTa4cB1Zd3GeqPlKaI - Uday Shankar
显示剩余5条评论
1个回答

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:将警告视为错误

编辑2: 每次运行此代码时我都会遇到错误。您如何编译此代码?也许Eclipse编译器(?)仍然允许您运行此代码?

编辑3: 根据问题的作者所说,该代码仅在Eclipse中运行。有时Eclipse编译器似乎会表现不同,但在这种情况下,您应该将JDK视为命令式(因为您的构建不是在Eclipse中完成的,而是在Maven中使用javac)。我不确定原因(可以在JLS中搜索),但为什么要混合类型边界和仅用于Java 1.5之前版本向后兼容性的原始类型?

似乎在泛型方面Eclipse和javac之间存在其他差异:Maven编译器与Eclipse编译器泛型差异?


我试图只定义一个ProtocolHandler,而不是为每个MappingRule类型定义一个。 - mstelz
MappingRule是一个泛型类型,因此需要提供一些类型信息。我已经更新了我的帖子,例如使用<String,String> - user140547
我知道它是一个通用类型,但你不能像这样使用它们作为原始类型,例如 List testList = new ArrayList(); 这是通用的并会给出警告,但在大多数情况下仍然可以使用。 - mstelz
仅在Eclipse中,它会自动构建并允许我使用它,没有任何问题。 - mstelz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接