java 中的类型不匹配?
type mismatch in java?
我有以下代码:
public class AClass {
public AClass() {
System.out.println("Constructor A");
}
}
public class BClass extends AClass{
public BClass(){
System.out.println("Constructor B");
}
}
public class Test {
public static void main(String[] args) {
BClass b = new BClass();
}
}
我更改了代码,如下所示:
public class AClass {
public AClass() {
System.out.println("Constructor A");
}
}
public class BClass extends AClass{
public BClass(){
System.out.println("Constructor B");
}
}
public class Test {
public static void main(String[] args) {
BClass b = new AClass();
}
}
在第二个代码片段中,我收到此更改的类型不匹配错误 BClass b = new AClass();
。
我正在学习java,我想了解错误的深层含义,我想知道为什么第二个代码片段中的错误?
您可以 AClass b = new BClass();
但不能 BClass b = new AClass();
因为 AClass
是 BClass
的父级。在多态性中是不允许的。
说你说;狗是一种动物,如
class Animal { }
class Dog extends Animal {
public void bark() { }
}
class Cat extends Animal {
public void meow() { }
}
Animal a = new Dog(); // is ok.
但是你不能说;动物是狗的一种。
Dog d = new Animal(); // not ok.
d.bark(); // Animal doesn't have a bark();
试试 AClass a = new BClass();
。
Liskov substitution principle 表示
if S is a subtype of T, then objects of type T may be replaced with objects of type S
在您的示例中,这意味着类型 A 的对象可能会被类型 B 的对象替换。您正试图以相反的方式进行。原则是说,当你说 B 是 A 的子类型时,你可以将 B 的所有实例都视为 A。例如,所有狗都可以视为哺乳动物。
您的示例试图做的是创造一种哺乳动物并将其当作狗对待。
您正在尝试执行 downcasting
。要使此代码正常工作,只需使用以下代码更改您的代码:
public class AClass {
public AClass() {
System.out.println("Constructor A");
}
}
public class BClass extends AClass{
public BClass(){
System.out.println("Constructor B");
}
}
public class Test {
public static void main(String[] args) {
AClass b = new BClass();
doDownCasting(b);
}
private static void doDownCasting(AClass a){
if(a instance of BClass){
BClass bClass = (BClass)a; // do the downcasting here
}
}
}
我有以下代码:
public class AClass {
public AClass() {
System.out.println("Constructor A");
}
}
public class BClass extends AClass{
public BClass(){
System.out.println("Constructor B");
}
}
public class Test {
public static void main(String[] args) {
BClass b = new BClass();
}
}
我更改了代码,如下所示:
public class AClass {
public AClass() {
System.out.println("Constructor A");
}
}
public class BClass extends AClass{
public BClass(){
System.out.println("Constructor B");
}
}
public class Test {
public static void main(String[] args) {
BClass b = new AClass();
}
}
在第二个代码片段中,我收到此更改的类型不匹配错误 BClass b = new AClass();
。
我正在学习java,我想了解错误的深层含义,我想知道为什么第二个代码片段中的错误?
您可以 AClass b = new BClass();
但不能 BClass b = new AClass();
因为 AClass
是 BClass
的父级。在多态性中是不允许的。
说你说;狗是一种动物,如
class Animal { }
class Dog extends Animal {
public void bark() { }
}
class Cat extends Animal {
public void meow() { }
}
Animal a = new Dog(); // is ok.
但是你不能说;动物是狗的一种。
Dog d = new Animal(); // not ok.
d.bark(); // Animal doesn't have a bark();
试试 AClass a = new BClass();
。
Liskov substitution principle 表示
if S is a subtype of T, then objects of type T may be replaced with objects of type S
在您的示例中,这意味着类型 A 的对象可能会被类型 B 的对象替换。您正试图以相反的方式进行。原则是说,当你说 B 是 A 的子类型时,你可以将 B 的所有实例都视为 A。例如,所有狗都可以视为哺乳动物。
您的示例试图做的是创造一种哺乳动物并将其当作狗对待。
您正在尝试执行 downcasting
。要使此代码正常工作,只需使用以下代码更改您的代码:
public class AClass {
public AClass() {
System.out.println("Constructor A");
}
}
public class BClass extends AClass{
public BClass(){
System.out.println("Constructor B");
}
}
public class Test {
public static void main(String[] args) {
AClass b = new BClass();
doDownCasting(b);
}
private static void doDownCasting(AClass a){
if(a instance of BClass){
BClass bClass = (BClass)a; // do the downcasting here
}
}
}