Java 泛型中的类型转换错误
我刚刚开始学习泛型。在这里我试图将全局obj的值设置为本地obj的值。但是我得到了类型转换错误。这个错误的原因是什么Java 泛型中的类型转换错误,java,generics,Java,Generics,我刚刚开始学习泛型。在这里我试图将全局obj的值设置为本地obj的值。但是我得到了类型转换错误。这个错误的原因是什么 class GenUpperBound<T> { T obj; public <T extends Number> void set(T obj) { this.obj=obj; } public static void main(String...q) { GenUpperBound&l
class GenUpperBound<T>
{
T obj;
public <T extends Number> void set(T obj)
{
this.obj=obj;
}
public static void main(String...q)
{
GenUpperBound<Integer> w=new GenUpperBound<>();
w.set(10);
}
}
类绑定
{
T-obj;
公共无效集(T obj)
{
obj=obj;
}
公共静态void main(字符串…q)
{
GenUpperBound w=新的GenUpperBound();
w、 组(10);
}
}
这里是错误
GenupperBound.java:6: error: incompatible types: T#1 cannot be converted to T#2
this.obj=obj;
^
where T#1,T#2 are type-variables:
T#1 extends Number declared in method <T#1>set(T#1)
T#2 extends Object declared in class GenUpperBound
1 error
GenupperBound.java:6:错误:不兼容的类型:T#1无法转换为T#2
obj=obj;
^
其中T#1,T#2是类型变量:
T#1扩展了方法集(T#1)中声明的数字
T#2扩展了类GenUpperBound中声明的对象
1错误
您必须像
class GenUpperBound<T extends Number>
类绑定
因为否则,您的
obj
可能是String类型,并且您不能为字符串分配数字。您必须像
class GenUpperBound<T extends Number>
类绑定
因为在其他情况下,您的obj
可能是String类型,并且您无法为字符串分配数字。请尝试以下操作:
class GenUpperBound<T extends Number>
{
T obj;
public void set(T obj)
{
this.obj=obj;
}
public static void main(String...q)
{
GenUpperBound<Integer> w=new GenUpperBound<>();
w.set(10);
}
}
类绑定
{
T-obj;
公共无效集(T obj)
{
obj=obj;
}
公共静态void main(字符串…q)
{
GenUpperBound w=新的GenUpperBound();
w、 组(10);
}
}
试试这个:
class GenUpperBound<T extends Number>
{
T obj;
public void set(T obj)
{
this.obj=obj;
}
public static void main(String...q)
{
GenUpperBound<Integer> w=new GenUpperBound<>();
w.set(10);
}
}
类绑定
{
T-obj;
公共无效集(T obj)
{
obj=obj;
}
公共静态void main(字符串…q)
{
GenUpperBound w=新的GenUpperBound();
w、 组(10);
}
}
构造函数作用域类型参数
隐藏类作用域类型参数
。这两个T
不代表相同的类型
这就是编译器拒绝编译代码的原因,因为构造函数中的参数可能与类的参数化类型不同。例如:
new GenUpperBound<String>(new Integer(1));
现在这种编译也很好,但是T
和U
显然代表了不同的类型
您可以通过以下方法解决此问题:
class GenUpperBound<T extends Number> {
T obj;
public void set(T obj) {
this.obj=obj;
}
...
}
类绑定{
T-obj;
公共无效集(T obj){
obj=obj;
}
...
}
现在没有第二个
t
类型参数,但是构造函数使用类范围的参数。在这种情况下,像new GenUpperBound(新整数(1))这样的语句
将不会编译,因为该参数的类型与实例参数化时使用的参数的类型不同。构造函数作用域类型参数
隐藏类作用域类型参数
。这两个T
不代表相同的类型
这就是编译器拒绝编译代码的原因,因为构造函数中的参数可能与类的参数化类型不同。例如:
new GenUpperBound<String>(new Integer(1));
现在这种编译也很好,但是T
和U
显然代表了不同的类型
您可以通过以下方法解决此问题:
class GenUpperBound<T extends Number> {
T obj;
public void set(T obj) {
this.obj=obj;
}
...
}
类绑定{
T-obj;
公共无效集(T obj){
obj=obj;
}
...
}
现在没有第二个t
类型参数,但是构造函数使用类范围的参数。在这种情况下,像new GenUpperBound(新整数(1))这样的语句
将不会编译,因为参数的类型与实例参数化时使用的类型不同