在实现无关Java接口的对象上强制转换

在实现无关Java接口的对象上强制转换,java,Java,这是我的等级制度 Eat和杂食动物是不相关的接口 哺乳动物实现Eat接口 Ursus扩展了哺乳类实现了Omnivora接口 猫科哺乳动物 可以看出,omnivora和eat是不相关的接口,但第1行和第2行分别打印“eat实例”和“omnivora实例” 有人能告诉我为什么吗 可以看出,omnivora和eat是不相关的接口,但第1行和第2行分别打印“eat实例”和“omnivora实例” 有人能告诉我为什么吗 因为您正在测试的对象是一个ursus,它实现了omnivora,也实现了eat(通过继

这是我的等级制度

Eat和杂食动物是不相关的接口

哺乳动物实现Eat接口

Ursus扩展了哺乳类实现了Omnivora接口

猫科哺乳动物

可以看出,omnivora和eat是不相关的接口,但第1行和第2行分别打印“eat实例”和“omnivora实例”

有人能告诉我为什么吗

可以看出,omnivora和eat是不相关的接口,但第1行和第2行分别打印“eat实例”和“omnivora实例”

有人能告诉我为什么吗

因为您正在测试的对象是一个
ursus
,它实现了
omnivora
,也实现了
eat
(通过继承
哺乳动物

关于接口的一个关键问题是,一个类可以实现多个不相关的接口,并且它的实例被认为是每个接口的“实例”


一个具体的例子是,它扩展了
读卡器
,但也实现了
可读
可关闭
可自动关闭
。最后两个本身与读取无关,但类的实例是所有这些接口的实例。

Madaminia
实现了
eat
omnivora
,这意味着
Madaminia
的任何子类都是这两个接口的子类型。因此,任何
ursus
对象既是
eat
对象,也是
杂食动物

操作符
instanceof
不会检查对象的
静态类型,而是检查对象的
动态类型<代码>(杂食动物)eat的i实例与eat的i实例完全相同

无论你投了多少,动态类型的
i
都是
ursus
,它是
eat
杂食动物的子类。结果与你所得到的不会有什么不同


请尊重Java的命名约定。您的程序极难阅读。

请记住,接口名和类名应以大写开头;不是小写。两个接口的间接实现,因为“Ursus扩展了哺乳动物实现了杂食接口”(哺乳动物实现了eat)
    class inher1
    {

    public static void main(String...args)
    {

     eat i = new ursus();


      if(i instanceof eat) System.out.println("Instance of eat");

 //Line 1
 if((omnivora)i instanceof eat) System.out.println("Instance of eat"); 
 //Line 2
if((omnivora)i instanceof omnivora) System.out.println("Instance of omnivora"); 

 if(((omnivora)i).like_honey)System.out.println("Like Honey Obtained");

    }

    }

    interface eat //Interface 1
    {
        public void eat();
    }

    interface omnivora //Interface 2
    {
        final public static boolean like_honey = true;
    }
    abstract class mammalia implements eat
    {
      abstract public void makenoise();
      public void eat(){System.out.println("Yummy");}
    }

    class ursus extends mammalia implements omnivora
    {
        public void makenoise(){System.out.println("Growl");}


    }

    class felidae extends mammalia
    {
        public void makenoise(){System.out.println("Roar");}
    }