【问题标题】:Why is the compiler allowing me to cast one implementing class to another? [duplicate]为什么编译器允许我将一个实现类转换为另一个实现类? [复制]
【发布时间】:2019-12-22 09:21:49
【问题描述】:

所以我一直在搞砸,试图找出什么有效,什么无效。我有三个类:一个基类Animal,以及两个派生类DogCat

private class Animal {
}

private class Dog extends Animal {
}

private class Cat extends Animal {
}

出于明显的原因,编译器不允许使用以下代码:

Dog dog = s.new Dog();
Cat cat = (Cat) dog;

这是因为我将一个派生类转换为另一个派生类,这是不可能的。但是,如果我将Animal 设置为接口类型并将Cat 设置为接口类型,那么编译器会突然接受它并且不会说任何问题,即使这是不可能的。

private interface Animal {

}

private class Dog implements Animal {

}

private interface Cat extends Animal {

}

只要我运行与以前相同的代码,它就会像预期的那样给我一个错误。

【问题讨论】:

  • 我认为这里的问题是接口Cat 不是一个实现,只是一个与接口Animal 没有区别的实现规范(目前)。所以,将狗投给Cat 接口并没有错。
  • 编译器允许你将任何东西转换为任何东西;这在runtimne是否有效是另一回事。演员表是你告诉编译器我更了解,而你认为​​是 Foo 的东西也是 Bar
  • 我更正了你相当混乱的术语。

标签: java inheritance downcast


【解决方案1】:

允许这样做的原因是因为完全有可能存在另一个类,如下所示:

class CatDog extends Dog implements Cat {
}

因为这样的类可能存在,所以将任何(非final)类型的对象强制转换为任何接口类型都是合法的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 2019-06-09
  • 2020-11-05
  • 1970-01-01
  • 2011-04-10
  • 2013-07-07
相关资源
最近更新 更多