有 Java 编程相关的问题?

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

java正在查找什么类型的类

我有三个班,A班,B班,C班。这三个类都实现了“ClassInterface”接口

class ClassA<T> implements ClassInterface<T>{}

class ClassB<T> implements ClassInterface<T>{}

class ClassC<T> implements ClassInterface<T>{} 

我在其他类别D中有方法:

void methodname(ClassInterface<T> CI[]){}

在方法中,我需要找到每个元素属于哪个类?i、 e CI[i]属于A类、B类还是C类

我试过“instacneof”,但它给了我错误。我不知道我的方法是否正确


共 (4) 个答案

  1. # 1 楼答案

    泛型是使用类型擦除实现的,这意味着ClassInterface<String>ClassInterface<Double>在运行时都只是普通的原始ClassInterface

    因此,这样的事情毫无意义:

    if(x instanceof ClassInterface<String>) {
      // ... do something
    } else if (x instanceof ClassInterface<Double>) {
      // ... do something else
    }

    因为在运行时,字节码会说

    if(x instanceof ClassInterface) {
      // ... do something
    } else if (x instanceof ClassInterface) {
      // ... do something else
    }

    正如其他海报所提到的,这种类型的铸造是一种代码气味,这表明了一个糟糕的设计。如果您必须根据ClassInterface的实现进行一些处理,那么根据您的情况,您应该考虑:

    • 在接口上定义一个方法,并在每个子类上执行特定的实现
    • Visitor Pattern应用于接口和实现,以便您可以编写一个访问者,在需要时按项执行自定义处理逻辑
    • 如果确实需要类似类型转换的行为,那么可以使用Super Type Token模式根据类型参数做出决策。这可能很简单,只需向接口添加一个方法,如:Class<T> getType();,然后执行一个if语句,如:
    // I really wouldn't recommend this, but it still is an option...
    if(String.class.equals(x.getType())) {
      // ... do something
    } else if (Double.class.equals(x.getType())) {
      // ... do something else
    }
  2. # 2 楼答案

    转换您的观点,而不是试图从调用方方法理解类型,给每个类一个不同的实现,让每个类都有一个专门的行为

    这意味着在ClassA、ClassB和ClassC中实现一个由接口声明的公共方法,并从调用方调用它

  3. # 3 楼答案

    确保您没有尝试模板化检查实例。。。模板参数在编译过程中被“擦除”,因此您无法访问它们进行instanceof和其他运行时检查

    但是,是的,你所做的通常表明你的设计很糟糕

  4. # 4 楼答案

    那将是一个糟糕的设计理念!你本质上是“向上投射”。将参数作为接口传递的要点是,被调用的方法不应该知道或关心实现类是什么