1

可以在 java 中强制使用大写类型吗?请参阅示例。

public class Animal{}

public class Dog extends Animal{}

Dog dog = new Dog();  
Animal test = dog;

我所拥有的:(test instanceof Dog)(test instanceof Animal)返回 true。
我想要什么:(test instanceof Dog)== false 和(test instanceof Animal)== true

有没有办法强制测试只是一个动物?或者唯一的方法是为动物通过狗创建一个构造函数?我试图避免创建构造函数,因为我有一个复杂的对象,有很多 getter/setter。

谢谢。

4

5 回答 5

7

我不知道你为什么会关心一个对象是否是 anAnimal而不是 a Dog,毕竟 aDog是 an Animal。任何可以适用于 a 的东西都Dog应该适用于 a Animal,否则存在设计问题。

但是,如果您必须确定,则调用getClass()(由 定义Object)来获取Class对象,然后将其与Animal.class.

if (Animal.class == test.getClass())
于 2013-08-19T16:57:53.947 回答
2
if (test.getClass() == Animal.class) {...
于 2013-08-19T16:57:49.850 回答
1

当您“扩展”时,您是在说狗动物。我看到您编码时的行为是正确的。

如果你有-

class Animal {}
class Human {}

class Cat extends Animal{}
class Child extends Human {}

猫是动物。

孩子是人。

猫不是人。

孩子不是动物。

于 2013-08-19T16:56:56.157 回答
1

TestDog 的一个实例,而 testanimal 的一个实例。

这不是问题,它是面向对象编程的基础之一。多态性。

无论您出于何种原因确保该类型完全是 Type animal,都可能是由于设计不佳。

于 2013-08-19T16:57:46.507 回答
0

无法更改实例的类型。您可以使用和实例,就好像它是动物的实例。

此外,大量的 setter 和 getter 不应该是一个太大的问题,它不应该需要 Dog 的输入。只需有一个构造函数直接复制 Animal 中的所有字段(您可以直接使用同一类的其他对象访问字段),它就可以接受 dog 作为参数。

public class Animal{
    private int[] data;
    public Animal(Animal a){
        data=a.data;
        ...
    }
}
于 2013-08-19T23:45:45.770 回答