为什么我通过将 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
其实泛型变量ageParam
是Integer
。必须将 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);
孤立地看待你的MyGenClass
。 T
可以是任何字面意思。它不一定是整数。我可以用字符串、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)
我有以下程序:
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
其实泛型变量ageParam
是Integer
。必须将 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);
孤立地看待你的MyGenClass
。 T
可以是任何字面意思。它不一定是整数。我可以用字符串、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)