检查通用方法中的类型

时间:2013-10-08 16:00:14

标签: java generics generic-method

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

3 个答案:

答案 0 :(得分: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);
}

如果您只有Point2DPoint3D的实例,为什么要使用通用参数T

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

答案 1 :(得分: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);
    }
}

答案 2 :(得分:1)

不可能,因为运行时type erasure。 JVM几乎不知道泛型,它们主要用于编译器检查类型。使用泛型编译器替换所有泛型类型检查类型后,编译后List<String>变为List<Object>,因此在运行时无法检测到。