找到什么类型的课程

时间:2010-10-20 01:42:21

标签: java

我有三个ClassA,ClassB,ClassC。所有这三个类都实现了“ClassInterface”接口。

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

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

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

我在其他类ClassD中有方法:

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

在方法中我需要找到每个元素属于哪个类?即CI [i]是属于ClassA,ClassB还是ClassC?

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

4 个答案:

答案 0 :(得分:7)

这将是一个糟糕的设计理念!你基本上是'向上'。将参数作为接口传递的重点是被调用的方法不应该知道或关心实现类是什么。

答案 1 :(得分:4)

转换你的观点,而不是尝试从调用方法中理解类型,给每个类提供不同的实现,并让每个类都有一个专门的行为。

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

答案 2 :(得分:2)

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

但是,是的,你所做的通常表明设计不好。

答案 3 :(得分:2)

泛型是使用Type Erasure实现的,这意味着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
}