强制Java上级类

时间:2013-08-19 16:54:49

标签: java class casting

可以在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。

感谢。

5 个答案:

答案 0 :(得分:7)

我不知道为什么你会关心对象是Animal而不是Dog,毕竟DogAnimal。任何适用于Dog的内容都应适用于Animal,否则会出现设计问题。

但如果您必须确定,请拨打getClass()(由Object定义)以获取Class对象,然后将其与Animal.class进行比较。

if (Animal.class == test.getClass())

答案 1 :(得分:2)

if (test.getClass() == Animal.class) {...

答案 2 :(得分:1)

当你“延伸”时,你说狗 是动物。我看到你编码的行为是正确的。

如果你有 -

class Animal {}
class Human {}

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

猫是动物。

孩子是人类。

猫不是人类。

孩子不是动物。

答案 3 :(得分:1)

测试 是Dog的一个实例,测试 是一个动物实例。

这不是问题,它是OO编程的基础之一。多态性。

无论你有什么理由确保类型完全是类型动物可能是由于设计不佳。

答案 4 :(得分:0)

无法更改实例的类型。你可以使用和它的实例一样的动物实例。

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

public class Animal{
    private int[] data;
    public Animal(Animal a){
        data=a.data;
        ...
    }
}