Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在超类中编写一个方法,其参数类型被限制为属于调用对象的同一子类的另一个对象_Java_Oop_Polymorphism_Object Oriented Analysis - Fatal编程技术网

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(),当从子类对象调用该方法时,提供给该方法的参数必须是同一子类的对象,否

我是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()
,当从子类对象调用该方法时,提供给该方法的参数必须是同一子类的对象,否则会触发编译器错误。例如:

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.