Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.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_Class_Casting - Fatal编程技术网

强制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 有没有一种方法可以强迫测试者只做一只动物?或者唯一的方法是为经过狗的动物创建构造器?我试图避免创建构造函数,因为我

在java中强制使用上转换类型是可能的吗?参见示例

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:未知实体”。如果我坚持,我就没事了。这就是为什么我不想“测试”动物的原因。假设测试必须是特定的动物。如果重点是检查
测试
不是
,而是任何其他类型的
动物
,那么我想恢复一个原始检查就足够了:
!(测试插件)