Java 如何在超类中编写一个方法,其参数类型被限制为属于调用对象的同一子类的另一个对象
我是Java编程新手。请考虑下面的代码片段。Java 如何在超类中编写一个方法,其参数类型被限制为属于调用对象的同一子类的另一个对象,java,oop,polymorphism,object-oriented-analysis,Java,Oop,Polymorphism,Object Oriented Analysis,我是Java编程新手。请考虑下面的代码片段。 public class Animal { public void mate( /*what should I put here?*/ anotherAnimal ) { } } public class Cat extends Animal { } public class Dog extends Animal { } 我想编写方法Animal.mate(),当从子类对象调用该方法时,提供给该方法的参数必须是同一子类的对象,否
public class Animal {
public void mate( /*what should I put here?*/ anotherAnimal ) {
}
}
public class Cat extends Animal {
}
public class Dog extends Animal {
}
我想编写方法Animal.mate()
,当从子类对象调用该方法时,提供给该方法的参数必须是同一子类的对象,否则会触发编译器错误。例如:
Cat cat = new Cat();
Dog dog = new Dog();
Animal randomAnimal = new Animal();
Cat trueLove = new Cat();
cat.mate( dog ); // raises a compiler error
cat.mate( randomAnimal ); //compiler error
cat.mate( trueLove ); //passes compiler check
我问的可能吗?我有一种模糊的感觉,那就是使用泛型可能做到这一点。没有办法让编译器阻止所有错误的调用。即使您参数化了
Animal
,仍然可以在运行时执行类似cat.mate(dog)
的操作
如果您的业务逻辑需要这样做,那么您的最佳选择就是验证,例如:
如果您这样做主要是为了改进编译时类型检查,那么您可以使用泛型,了解其局限性:
class Animal<T extends Animal<T>> {
public final void mate(T anotherAnimal) {
}
}
你的问题即将解决。 在mate方法中使用super类作为参数类型。super类为Animal。 代码如下:
public class Animal {
public void mate(Animal animal) {
System.out.println("Animals mating");
}
@Override
public String toString() {
return "Animal";
}
public class Dog extends Animal {
@Override
public String toString() {
return "Dog";
}
public class Cat extends Animal {
@Override
public void mate(Animal obj) {
System.out.println("cat mating with " + obj );
}
@Override
public String toString() {
return "cat";
}}
并在main方法中运行代码。错误已经消失,答案如下:
cat mating with Dog.
cat mating with Animal.
cat mating with cat.
为了得到更好的答案,而不是说猫或狗,您可以在动物类中定义一个名称字段。您可以使用
Animal
,cat扩展Animal
和配偶(伴侣)
。关于:Animal a=new cat();a、 交配(新动物())
你认为这行得通吗?@Sweeper如果你能给我一些让它行得通的东西,那就更好了,但我会很高兴得到一些只会让它行得通的东西;猫咪(新猫咪())你认为的工作地点a.mate(新动物())代码>应该编译吗?我不这么认为。在运行时,a
存储一个Cat
对象,而Cat
对象不能与Animal
对象交配,对吗?
public class Animal {
public void mate(Animal animal) {
System.out.println("Animals mating");
}
@Override
public String toString() {
return "Animal";
}
public class Dog extends Animal {
@Override
public String toString() {
return "Dog";
}
public class Cat extends Animal {
@Override
public void mate(Animal obj) {
System.out.println("cat mating with " + obj );
}
@Override
public String toString() {
return "cat";
}}
cat mating with Dog.
cat mating with Animal.
cat mating with cat.