有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在泛型方法中检查类型

我想知道是否有可能在一个方法中使用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) 个答案

  1. # 1 楼答案

    I to know if it is possible to have an if statement in a method that will check the type of the generic used.

    一般来说不是这样,因为类型擦除。基本上,执行时不知道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. # 2 楼答案

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

  3. # 3 楼答案

    简单的重载和避免泛型如何

    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之类的方法