Java 扩展泛型父对象时的值转换

Java 扩展泛型父对象时的值转换,java,generics,inheritance,Java,Generics,Inheritance,为什么子类仍然需要强制转换才能从父类的Generic属性访问值?有什么特别的原因吗?看看: class a<U, T> { public U u; public T t; public a(U u, T t) { this.u = u; this.t = t; } public U getU(){ return u; }

为什么子类仍然需要强制转换才能从父类的
Generic
属性访问值?有什么特别的原因吗?看看:

    class a<U, T> {    

    public U u;   
    public T t;    
    public a(U u, T t) {
        this.u = u;
        this.t = t;            
    }

    public U getU(){
         return u;
     }   
   }


class b extends a { 
    public b(String u, Integer t) { super(u, t); }


     // Here I call b's parent method where casting occurs
    public String get(){
    return (String) getU(); // Here's the cast
    }
}
a类{
公共大学;
公共交通;
公共a(U,T){
这个。u=u;
t=t;
}
公共部门{
返回u;
}   
}
类b扩展了{
公共b(字符串u,整数t){super(u,t);}
//在这里,我调用b的父方法,其中发生了强制转换
公共字符串get(){
return(String)getU();//下面是演员阵容
}
}
我知道
super.getU()
返回的类型是
U
,但不是从
a
继承的
b
,这意味着
a
的属性将对其子类可见!?Plus超类的构造函数被super(11111,“aString”)引用过?告诉
b
的父母“我是你的孩子,传递的是
整数
&a
字符串”
,这还不够吗?在我看来,类“a”和类“b”之间没有关系


*UDPATE:代码错误已被修复,很抱歉,因为我打字很匆忙

如您所料,这里不需要强制转换

我认为你的实际问题是当你这样做的时候:

B extends A<String, Integer>

如您所料,这里不需要强制转换

我认为你的实际问题是当你这样做的时候:

B extends A<String, Integer>

编辑后,问题是在
extends
声明中使用了原始类型

class b extends a {
使用原始类型(例如
a
)时,所有类型参数都将被删除。调用父类“
getU()
方法时,返回类型被删除到其上限,即从
U
对象。您的子类方法的返回类型为
String
,但您试图返回一个
对象“”。这就是为什么演员阵容是必要的

阅读

不要使用原始类型。参数化您的类型用法,则不需要使用大小写

class b extends a<String, Integer> {

    public b(String u, Integer t) {
        super(u, t);

    }    

    public String get() {
        return getU();  
    }
}
b类扩展了a类{
公共b(字符串u,整数t){
超级(u,t);
}    
公共字符串get(){
返回getU();
}
}

编辑后,问题是您在
扩展
声明中使用了原始类型

class b extends a {
使用原始类型(例如
a
)时,所有类型参数都将被删除。调用父类“
getU()
方法时,返回类型被删除到其上限,即从
U
对象。您的子类方法的返回类型为
String
,但您试图返回一个
对象“”。这就是为什么演员阵容是必要的

阅读

不要使用原始类型。参数化您的类型用法,则不需要使用大小写

class b extends a<String, Integer> {

    public b(String u, Integer t) {
        super(u, t);

    }    

    public String get() {
        return getU();  
    }
}
b类扩展了a类{
公共b(字符串u,整数t){
超级(u,t);
}    
公共字符串get(){
返回getU();
}
}

不指定u和t的类型,它们将在编译时被视为对象类型,因此需要进行转换,因为u是对象类型而不是字符串。type@Rod_Algonquin这就是为什么我要求,为什么我仍然需要指定u和t的类型,而不指定它们在编译时会被视为对象类型的u和t类型,因此您需要将其转换为U,因为u是对象类型而不是字符串。type@Rod_Algonquin这就是为什么我要求,为什么我仍然需要指定U和T的类型。哦,是的,就是这样,它让我感到困惑,因为super(String..,Integer..)没有显示任何错误,所以我假设类b只会理解类型。谢谢我错过了今天下午实习面试的那个,但是nvm@Fev编译器通常会为原始类型显示警告。现在你知道了。下次你会拿到的。祝你好运哦,是的,就是这样,它让我感到困惑,因为super(String..,Integer..)没有向我显示任何错误,所以我假设类b只会理解类型。谢谢我错过了今天下午实习面试的那个,但是nvm@Fev编译器通常会为原始类型显示警告。现在你知道了。下次你会拿到的。祝你好运