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编译器通常会为原始类型显示警告。现在你知道了。下次你会拿到的。祝你好运