我现在正在练习Java,并试图深入研究泛型。我想使此代码工作:
public class TwoD { // simple class to keep two coordinate points
int x, y;
TwoD(int a, int b) {
x = a;
y = b;
}
}
public class ThreeD extends TwoD { //another simple class to extend TwoD and add one more point
int z;
ThreeD(int a, int b, int c) {
super(a, b);
z = c;
}
}
public class FourD extends ThreeD { //just like previous
int t;
FourD(int a, int b, int c, int d) {
super(a, b, c);
t = d;
}
}
public class Coords<T extends TwoD> { //class to keep arrays of objects of any previous class
T[] coords;
Coords(T[] o) {
coords = o;
}
}
现在,我想制作一个将使用TwoD和ThreeD对象而不使用FourD对象的方法。
我已经尝试过了:
static void showXYZsub(Coords<? super FourD> c) {
System.out.println("X Y Z:");
for (int i = 0; i < c.coords.length; i++)
System.out.println(c.coords[i].x + " " + c.coords[i].y +
" " + c.coords[i].z);
System.out.println();
}
但出现错误“ z无法解析或不是字段”。
据我所知,关键字
super
应该过滤扩展FourD
和FourD
本身的任何类的对象,但是即使我将FourD
更改为ThreeD
或TwoD
,也会出现错误相同。即如果我使用
super
,只有TwoD字段可见,但是在extends
的情况下,一切正常。Coords
类有问题还是什么?请帮忙。非常抱歉。
---编辑:要求showXYZsub
FourD fd[] = {
new FourD(1, 2, 3, 4), new FourD(6, 8, 14, 8), new FourD(22, 9, 4, 9),
new FourD(3, -2, -23, 17) };
Coords<FourD> fdlocs = new Coords<FourD>(fd);
showXYZsub(fdlocs);
最佳答案
Coords<? super FourD> c
这意味着:
c
是Coords
,其中type参数是某些未知类型,是FourD
的超类型。成员变量
z
在ThreeD
中定义,它是FourD
的超类型。但是,? super FourD
不能保证类型T
至少是ThreeD
。例如,它也可以是TwoD
或Object
,它们也是FourD
的超类型。因此,您不能访问成员变量
z
,因为类型T
可能没有此成员变量。看来您实际上要使用:
Coords<? extends ThreeD> c
关于java - 具有super关键字的Java通用方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30168337/