为什么我通过将 Integer 类型参数设置为泛型中的 Integer 变量而出错?

Why i am getting error by setting the Integer type parameter to the Integer variable in generics?

我有以下程序:

class MyGenClass{

    public <T> void setAge(T ageParam){
        Integer age = ageParam;
    }

}
class Program{

    public static void main(String args[]){

        MyGenClass gnClass = new MyGenClass();
        gnClass.<Integer>setAge(80);

    }

}

事实上,我正在传递 Integer 那么为什么 ageParam 没有分配给 age。当我这样做时:

class MyGenClass{

    public <T> void setAge(T ageParam){
        T age = ageParam;
    }

}

为什么泛型变量没有赋给Integer类型变量age其实泛型变量ageParamInteger。必须将 ageParam 分配给类型为 T 的变量是强制性的吗?这背后的场景是什么?

不能保证 T 类型与 Integer 兼容。为了清楚起见,您必须使用以下方法,其中 T 将是 Integer 的子类型:

public <T extends Integer> void setAge(T ageParam){
    age = ageParam;
}

但是,我认为这没有意义。为了可变性考虑以下方法:

class MyGenClass {
    Number age;
    public <T extends Number> void setAge(T ageParam){
        age = ageParam;
    }
}

因此以下是可能的(可以推断显式类型参数,思想):

MyGenClass gnClass = new MyGenClass();
gnClass.<Integer>setAge(80);
gnClass.<Long>setAge(80L);
gnClass.<Double>setAge(80.0);
gnClass.<Float>setAge(80.0F);

孤立地看待你的MyGenClassT 可以是任何字面意思。它不一定是整数。我可以用字符串、HashMap 或 ArrayList 或字面上的 任何其他方式.

来调用它
MyGenClass gnClass = new MyGenClass();
gnClass.setAge("hello");
gnClass.setAge(new HashMap<String, String>());
gnClass.setAge(new ArrayList<String>());

在所有这些情况下,对 Integer 变量的赋值都是无效的,因此会出现编译器错误。

你只是碰巧在你的例子中用整数调用它。编译器不能断言它会一直这样。

看起来您根本不应该使用泛型。只需将签名更改为

public void setAge(Integer ageParam)