强制Java高级转换类
在java中强制使用上转换类型是可能的吗?参见示例强制Java高级转换类,java,class,casting,Java,Class,Casting,在java中强制使用上转换类型是可能的吗?参见示例 public class Animal{} public class Dog extends Animal{} Dog dog = new Dog(); Animal test = dog; 我拥有的:(狗的测试实例)和(动物的测试实例)返回真值。 我想要的:(狗的测试实例)==false和(动物的测试实例)==true 有没有一种方法可以强迫测试者只做一只动物?或者唯一的方法是为经过狗的动物创建构造器?我试图避免创建构造函数,因为我
public class Animal{}
public class Dog extends Animal{}
Dog dog = new Dog();
Animal test = dog;
我拥有的:(狗的测试实例)
和(动物的测试实例)
返回真值。我想要的:
(狗的测试实例)
==false和(动物的测试实例)
==true
有没有一种方法可以强迫测试者只做一只动物?或者唯一的方法是为经过狗的动物创建构造器?我试图避免创建构造函数,因为我有一个复杂的对象,有很多getter/setter
谢谢。当你“延伸”时,你是说狗是一种动物。我看到你编码的行为是正确的
如果你有-
class Animal {}
class Human {}
class Cat extends Animal{}
class Child extends Human {}
猫是一种动物
孩子是人
猫不是人
孩子不是动物。当你“延伸”时,你说狗是动物。我看到你编码的行为是正确的
如果你有-
class Animal {}
class Human {}
class Cat extends Animal{}
class Child extends Human {}
猫是动物
孩子是人
猫不是人
孩子不是动物。测试是狗的例子,测试是动物的例子 这不是问题,它是OO编程的一个重要功能。多态性
无论您有什么理由确保该类型与动物类型完全相同,都可能是因为设计不当。测试是狗的一个实例,而测试是动物的一个实例
if (test.getClass() == Animal.class) {...
这不是问题,它是OO编程的功能之一。多态性
无论你有什么理由来确保该类型与动物类型完全一致,都可能是因为设计不当。我不知道你为什么会关心某个对象是
动物而不是狗,毕竟狗是动物。任何适用于狗
的东西都应该适用于动物
,否则就存在设计问题
if (test.getClass() == Animal.class) {...
但如果必须确定,则调用(由对象定义)以获取类
对象,然后将其与动物类
进行比较
if (Animal.class == test.getClass())
我不知道你为什么会关心一个物体是不是一只动物而不是一只狗,毕竟狗是一只动物。任何适用于狗
的东西都应该适用于动物
,否则就存在设计问题
但如果必须确定,则调用(由对象定义)以获取类
对象,然后将其与动物类
进行比较
if (Animal.class == test.getClass())
无法更改实例的类型。您可以使用和的实例,就好像它是动物的实例一样
另外,很多二传手和接球手不应该是太大的问题,也不应该需要狗的输入。只要有一个直接复制Animal中所有字段的构造函数(您可以使用同一类的其他对象直接访问字段),它就可以接受dog作为参数
public class Animal{
private int[] data;
public Animal(Animal a){
data=a.data;
...
}
}
无法更改实例的类型。您可以使用和的实例,就好像它是动物的实例一样
另外,很多二传手和接球手不应该是太大的问题,也不应该需要狗的输入。只要有一个直接复制Animal中所有字段的构造函数(您可以使用同一类的其他对象直接访问字段),它就可以接受dog作为参数
public class Animal{
private int[] data;
public Animal(Animal a){
data=a.data;
...
}
}
底层对象是一只狗
。无论铸造多少都无法改变这一点。如果你想要一个仅仅是动物的对象
,你需要以某种方式创建一个新动物
。如果你的设计依赖于此,那么它可能会被破坏。向我们展示一个实际的用例,而不是一个学术问题,希望得到一个不存在的语言特性。我认为@OliCharlesworth抓住了重点。看起来,如果不创建一个新的动物实例,就不可能做我想做的事情。请回答这个问题,这样我才能给你正确的答案。下面的对象是一只狗
。无论铸造多少都无法改变这一点。如果你想要一个仅仅是动物的对象
,你需要以某种方式创建一个新动物
。如果你的设计依赖于此,那么它可能会被破坏。向我们展示一个实际的用例,而不是一个学术问题,希望得到一个不存在的语言特性。我认为@OliCharlesworth抓住了重点。看起来,如果不创建一个新的动物实例,就不可能做我想做的事情。请回答这个问题,这样我才能给你正确的答案。问题是我正试图用hibernate持久化这个对象。当我尝试持久化“Dog”时,我得到了一个“java.lang.IllegalArgumentException:未知实体”。如果我坚持,我就没事了。这就是为什么我不想“测试”动物的原因。假设测试必须是特定的动物。如果重点是检查测试
不是狗
,而是任何其他类型的动物
,那么我想恢复一个原始检查就足够了:!(狗的测试实例)和(动物的测试实例)
。不是吗?如果这两个类是由不同的类加载器加载的,你应该使用equals
方法。@EdwinDalorzo如果有Animal
的另一个子类,比如说,Squid
?@rgetman我的观点正是如此。乌贼的例子不是狗,而是动物。最初的问题似乎表明,这是发问者想要实现的检查。问题是我正试图用hibernate持久化这个对象。当我尝试持久化“Dog”时,我得到了一个“java.lang.IllegalArgumentException:未知实体”。如果我坚持,我就没事了。这就是为什么我不想“测试”动物的原因。假设测试必须是特定的动物。如果重点是检查测试
不是狗
,而是任何其他类型的动物
,那么我想恢复一个原始检查就足够了:!(测试插件)