可以在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。
感谢。
答案 0 :(得分:7)
我不知道为什么你会关心对象是Animal
而不是Dog
,毕竟Dog
是Animal
。任何适用于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;
...
}
}