Java 查找什么类型的类

Java 查找什么类型的类,java,Java,我有三个班,A班,B班,C班。这三个类都实现了“ClassInterface”接口 class ClassA<T> implements ClassInterface<T>{} class ClassB<T> implements ClassInterface<T>{} class ClassC<T> implements ClassInterface<T>{} ClassA类实现ClassInterface{} 类

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

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

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

class ClassC<T> implements ClassInterface<T>{} 
ClassA类实现ClassInterface{}
类ClassB实现ClassInterface{}
类ClassC实现ClassInterface{}
我在其他类别D中有方法:

void methodname(ClassInterface<T> CI[]){}
void方法名(ClassInterface CI[]){
在方法中,我需要找到每个元素属于哪个类?i、 e CI[i]属于A类、B类还是C类


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

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

这将是一个糟糕的设计思想!你本质上是“向上投射”。将参数作为接口传递的全部意义在于,被调用的方法不应该知道或关心实现类是什么。

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


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

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


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

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


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

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


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

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

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

if(x instanceof ClassInterface<String>) {
  // ... do something
} else if (x instanceof ClassInterface<Double>) {
  // ... do something else
}
正如其他海报所提到的,这种类型的铸造是一种代码气味,这表明了一个糟糕的设计。如果您必须根据您拥有的
ClassInterface
的实现进行一些处理,那么根据您的情况,您应该考虑:

  • 在接口上定义一个方法,并在每个子类上执行特定的实现
  • 将应用于您的接口和实现,以便您可以编写一个访问者,在需要时逐项执行自定义处理逻辑
  • 如果确实需要类似类型转换的行为,那么可以使用模式根据类型参数做出决策。这可能很简单,比如向接口添加一个方法:
    classgettype()然后执行if语句,如:

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

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

if(x instanceof ClassInterface<String>) {
  // ... do something
} else if (x instanceof ClassInterface<Double>) {
  // ... do something else
}
正如其他海报所提到的,这种类型的铸造是一种代码气味,这表明了一个糟糕的设计。如果您必须根据您拥有的
ClassInterface
的实现进行一些处理,那么根据您的情况,您应该考虑:

  • 在接口上定义一个方法,并在每个子类上执行特定的实现
  • 将应用于您的接口和实现,以便您可以编写一个访问者,在需要时逐项执行自定义处理逻辑
  • 如果确实需要类似类型转换的行为,那么可以使用模式根据类型参数做出决策。这可能很简单,比如向接口添加一个方法:
    classgettype()然后执行if语句,如:

同意米奇的观点,认为这是一个糟糕的设计理念。但是
instanceof
应该可以工作。你犯了什么错误?“instacneof”听起来像是治疗粉刺。你确定你的代码拼写正确吗?同意米奇的说法,这是一个糟糕的设计想法。但是
instanceof
应该可以工作。你犯了什么错误?“instacneof”听起来像是治疗粉刺。你确定你的代码拼写正确吗?同意。有时,多态性的整个观点似乎被一些人忽略了:-)同意。有时,多态性的整个要点似乎被一些人忽略了:-)
// 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
}