0

我知道是否可以在方法中使用 if 语句来检查所用泛型的类型。在让我思考这个问题的情况下,我想以不同的方式处理一个非常基础Point2D的课程和一个Point3D课程。在我需要访问的 3D 点的情况下,Point3d.z我不确定这是否会导致问题 我想做的伪代码版本是

public <T> void processPoints(T point) {
    process(point.x);
    process(point.y);
    if (T == Point3D) { // What do I do here?
        process(point.z); // Will accessing z cause problems?
    }
}

实际上,代码process表示要复杂得多并且z依赖于xy因此我正在寻找一种避免代码重复的方法。我可能会想办法重载函数,但我很好奇,所以我可以了解更多关于泛型的信息。

4

3 回答 3

5

普通的旧重载和避免泛型怎么样?

public void processPoints(final Point2D point)
{
    process(point.x);
    process(point.y);
}

public void processPoints(final Point3D point)
{
    process(point.x);
    process(point.y);
    process(point.z);
}

如果您只有实例,Point2D为什么Point3D要使用泛型参数T

您应该寻找其他方法来删除代码重复而不是使用instanceof等。

于 2013-10-08T16:06:36.733 回答
3

我知道是否可以在方法中使用 if 语句来检查所用泛型的类型。

不是一般情况下,不是 - 因为类型擦除。基本上T在执行时不知道类型。

你可以使用:

if (point instanceof Point3D)

但这与检查自身T是否为Point3D. 不过,这可能是一个更好的主意:

public void processPoints(Point point) {
    process(point.x);
    process(point.y);
    if (point instanceof Point3D) {
        Point3D point3d = (Point3D) point;
        process(point3d.z);
    }
}
于 2013-10-08T16:02:11.863 回答
1

不,这是不可能的,因为在运行时类型擦除。JVM(几乎)对泛型一无所知,它们主要用于编译器检查类型。在使用泛型编译器检查类型后,编译器会替换所有泛型类型,比如在编译后List<String>变为List<Object>,因此在运行时无法检测到。

于 2013-10-08T16:03:42.513 回答