gpt4 book ai didi

带有 super 关键字的 Java 泛型方法

转载 作者:行者123 更新时间:2023-11-30 11:03:57 25 4
gpt4 key购买 nike

我现在正在练习 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 应该过滤任何扩展 FourDFourD 本身的类的对象,但即使我' d 把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,其中类型参数是某种未知类型,它是 FourD 的父类(super class)型。

成员变量z定义在ThreeD中,它是FourD的父类(super class)型。然而,? super FourD 不保证类型 T 至少是一个 ThreeD。例如,它也可以是 TwoDObject,它们也是 FourD 的父类(super class)型。

所以,你不能访问成员变量z,因为类型T可能没有这个成员变量。

看起来你真的想使用:

Coords<? extends ThreeD> c

关于带有 super 关键字的 Java 泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30168337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com