2010-10-20 64 views
1

我有三个ClassA ClassB ClassC。所有三个类都实现了“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[]){} 
在我需要找到哪个类的每个元素都属于方法

?即CI [i]是否属于ClassA,ClassB或ClassC?

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

+3

米奇同意以为这是个糟糕的设计理念。但'instanceof'应该可以工作。你得到了什么错误? – Thilo 2010-10-20 01:46:40

+2

“instacneof”几乎听起来像一个疙瘩治疗。你确定你在代码中拼写正确吗? – paxdiablo 2010-10-20 01:58:00

回答

7

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

+0

同意。有时候,多态的整个观点似乎通过了一些人:-) – paxdiablo 2010-10-20 01:56:32

4

切换你的观点,而不是试图从调用者方法中了解类型,给每个类一个不同的实现,并让他们每个人都有一个专门的行为。

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

2

确保你没有试图模拟你的instanceof检查模板参数在编译过程中被“擦除”,所以你没有访问它们的instanceof和其他运行时检查。

但是,你在做什么通常表明设计不好。

2

泛型使用类型擦除来实现,这意味着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 
}