我现在正在练习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本身的任何类的对象,但是即使我将FourD更改为ThreeDTwoD,也会出现错误相同。

即如果我使用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


这意味着:cCoords,其中type参数是某些未知类型,是FourD的超类型。

成员变量zThreeD中定义,它是FourD的超类型。但是,? super FourD不能保证类型T至少是ThreeD。例如,它也可以是TwoDObject,它们也是FourD的超类型。

因此,您不能访问成员变量z,因为类型T可能没有此成员变量。

看来您实际上要使用:

Coords<? extends ThreeD> c

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

10-12 01:47