Java 仿制药遵从性错误。Can';我修不好

Java 仿制药遵从性错误。Can';我修不好,java,generics,Java,Generics,我在学习泛型时遇到了这个问题。我很困惑为什么代码不起作用 public class Test { public static void main(String args[]) { int result; result = printValues(new Pair<String, Double>("Pair1", 3.0), new Pair<String, Double>("Pair2", 4.0));

我在学习泛型时遇到了这个问题。我很困惑为什么代码不起作用

public class Test {
    public static void main(String args[]) {
        int result;

        result = printValues(new Pair<String, Double>("Pair1", 3.0), new 
        Pair<String, Double>("Pair2", 4.0));
        System.out.println(result);
    }

    public static <K, V extends Integer> int printValues(Pair<K, V> p1, Pair<K, V> p2) {
        return p1.getValue() + p2.getValue();
    }

    class Pair<K, V> {
        private K key;
        private V value;

        public Pair(K key, V value) {

            this.key = key;
            this.value = value;
        }

        public K getKey() {
            return key;
        }

        public V getValue() {
            return value;
        }

        public void setKey(K key) {
            this.key = key;
        }

        public void setValue(V value) {
            this.value = value;
        }

    }
}
公共类测试{
公共静态void main(字符串参数[]){
int结果;
结果=打印值(新对(“Pair1”,3.0),新
配对(“配对2”,4.0));
系统输出打印项次(结果);
}
公共静态int打印值(对p1,对p2){
返回p1.getValue()+p2.getValue();
}
类对{
私钥;
私人价值;
公共对(K键,V值){
this.key=key;
这个值=值;
}
公共K getKey(){
返回键;
}
public V getValue(){
返回值;
}
公共无效设置密钥(K密钥){
this.key=key;
}
公共无效设置值(V值){
这个值=值;
}
}
}
我收到以下遵从错误: 类型测试中的方法printValues(Test.Pair,Test.Pair)不适用于参数 (测试对,测试对) 我尝试更改方法printValues,如下所示:

public static <K, V extends Number> int printValues(Pair<K, V> p1, Pair<K, V> p2) {
    return p1.getValue() + p2.getValue();
}
公共静态int打印值(对p1,对p2){
返回p1.getValue()+p2.getValue();
}
但是错误是“运算符+对于参数类型V,V是未定义的”

编辑:

      public static <K, V extends Number> int printValues(Pair<K, V> p1, 
        Pair<K, V> p2) {
           return p1.getValue().intValue() + p2.getValue().intValue();
         }
公共静态int打印值(对p1,
对(p2){
返回p1.getValue().intValue()+p2.getValue().intValue();
}
现在我在printValues(新的一对)上得到错误
没有可访问的类型测试的封闭实例。必须使用类型测试的封闭实例来限定分配(例如,x.new A(),其中x是测试实例)。

您的代码几乎没有问题

  • 新对
    不适用于
    ,因为
    不扩展
    整数
    。一种方法是使用
    数字
    重新定义方法,如下所示:

  • 无需在对象上声明泛型类型,从Java 7开始,使用
    操作符就足够了:

    Number result = printValues(new Pair<>("Pair1", 3.0), new Pair<>("Pair2", 4.0));
    
    Number结果=打印值(新对(“Pair1”,3.0),新对(“Pair2”,4.0));
    
  • 公共静态int打印值(对p1,对p2){
    返回p1.getValue().intValue()+p2.getValue().intValue();
    }
    

    在Java中,如果子类Number,则不能继承+运算符(或任何其他运算符)。另一方面,继承方法(即intValue)

    V
    ,虽然是
    Number
    的子类,但仍然是一个类。不能在类上使用
    +
    ,只能在原语(和
    字符串
    s)上使用。
    整数
    (包装类)与
    int
    (原语)不同。您可以使用
    Number
    类的方法:。我想知道为什么eclipse会给我一个更完整的错误消息:“类型测试中的方法printValues(Test.Pair,Test.Pair)不适用于参数(Test.Pair,Test.Pair)”???这不是数字的问题,所以plzz不会将其标记为重复,但在问题更改之前,这是
    数字的问题…答案的问题是不够精确。术语已关闭。
    +
    在类上不起作用(除了
    字符串
    )。它甚至不适用于
    Integer
    ,因为这是一个类而不是一个基元。这与继承无关。像
    intValue
    这样的方法在父类
    Number
    中声明。但是,如果传递的
    Number
    双精度
    则使用
    intValue
    会为ad生成错误的结果附加。唯一正确的方法是检查类型并使用适当的对话方法。然后对原语使用
    +
    。@Zabuza我同意你的观点。
    +
    运算符适用于Java中的原语类型(和字符串)事实上,您可以在Integer、Double等实例上使用它,这是因为自动取消装箱。我的观点是,它不适用于Integer等的子类。至于intValue,他的方法有一个
    int
    返回类型。当然,他可以使用
    doubleValue()
    static class Pair<K, V> {
    
    Number result = printValues(new Pair<>("Pair1", 3.0), new Pair<>("Pair2", 4.0));
    
    public static <K, V extends Number> int printValues(Pair<K, V> p1, Pair<K, V> p2) {
        return p1.getValue().intValue() + p2.getValue().intValue();
    }