我知道是否有可能在检查所用泛型类型的方法中包含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,因此我正在寻找一种避免代码重复的方法。我可能会想出一种方法来重载该函数,但是我很好奇,因此我可以了解有关泛型的更多信息。

最佳答案

我知道是否有可能在检查所用泛型类型的方法中包含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);
    }
}

10-08 12:04