我有课程Animal
和两个子类Tiger
和Eagle
。两个子类都有hunt
方法,几乎相同。它们之间的唯一区别是受害者的类型。方法搜寻使用通用类Field<T>
来寻找受害者。它看起来像这样:
虎
void hunt(){
Field<Cattle> field = new Field<Cattle>();
List<Cattle> list = field.getObjects();
...
鹰
void hunt(){
Field<Rabbit> field = new Field<Rabbit>();
List<Rabbit> list = field.getObjects();
...
有没有办法执行类似的事情?
void hunt(Object type){
Field<type> field = new Field<type>();
List<type> list = field.getObjects();
我知道我可以获得Object
类型的列表并稍后使用instanceof
,但是我们来到第二个问题:
是否可以致电if( object instanceof instanceOfSomeClass)
?
答案 0 :(得分:2)
您可以使用泛型来实现您想要的目标:
public class AnimalsGenerics<E> {
public void Hunt(E prey){
...
}
}
并实施指定猎物的动物:
public class Tiger extends AnimalsGenerics<Buffalo> {
}
但是我的个人实施将使用界面来指定动物做什么,例如:如果动物不是猎人,例如草食动物会发生什么,你需要再次实施动物类吗?遵循将实现留给接口的原则而不是遗产可以帮助您获得更清晰的代码,我的设计将是:
设计行为:
public interface CollectFoodBehaviour<E> {
void collectFood(E prey);
}
类动物将是:
public class Animal<E> {
CollectFoodBehaviour<E> collectFoodBehaviour;
public void goToGetFood(E food){
collectFoodBehaviour.collectFood(food);
}
}
实施狩猎行为:
public class HuntAnimalsBehaviour<E> implements CollectFoodBehaviour<E> {
@Override
public void collectFood(E prey) {
//implemenet the generic hunting process
}
}
以动物实例为例:
public class Dog extends Animal<Rabbit> {
public Dog(){
this.collectFoodBehaviour = new HuntAnimalsBehaviour<Rabbit>();
}
}
答案 1 :(得分:1)
是否可以调用if(object instanceof instanceOfSomeClass)?
不, instanceof 测试对象是否是类的实例,而不是实例的实例(就好像左侧是非静态引用而右侧是静态引用) ;但是,您可以不声明您的实例
// JButton b = new JButton();
// if (b instanceof Component) can be replced with
if (JButton.class.newInstance() instanceof Component)
// or
if (new JButton() instanceof Component)
如果由于一些奇怪的原因你发现这很有用。
答案 2 :(得分:1)
如果我理解正确,您可以使用以下代码使用通用方法:
如果传递对象类而不是实例,则可以使用作为参数传递的Field
来构造Class
实例。
public class MyAnimal {
public <T> void hunt(Class<T> type) {
Field<T> field = new Field<>();
List<T> list = field.getObjects();
if (type == Cattle.class) {
System.out.println("Type is a Cattle");
} else {
System.out.println("Type is not a Cattle, is a " + type.getName());
}
}
public static void main(String[] args) {
new MyAnimal().hunt(Cattle.class);
new MyAnimal().hunt(new Cattle().getClass());
}
}
关于第二个问题,如果你有班级类型,你可以问一个简单的问题:type == MyClass.class
。