繁体   English   中英

传递具体类时无法解析方法

[英]Cannot resolve method when passing a concrete class

为什么这是无效的语法? 我认为在这个例子中会出现多态。 形状只能在运行时知道,它应该被分派到正确的方法。 为什么这行不通?

public class Test {

    public interface Shape {

    }

    static class Circle implements Shape {

    }

    static class Square implements Shape {

    }


    public void foo(Shape shape) {
        Shape s = new Circle();
        bar(s);
    }

    public void bar(Circle c) {

    }

    public void bar(Square s) {

    }
}

您应该使用圆形参考而不是形状:

public void foo(Shape shape) {
    Circle s = new Circle();
    bar(s);
}

在方法foo变量s是一个Shape类。 而您的bar方法只需要以下两种方法之一:Circle 或 Square。

如果您创建一个接收 Shape 的方法,您的代码将起作用

public void bar(Shape c) {

}

但是因为缺少,编译器抛出异常。

对于上述方法,您可以传递以下对象的引用:Shape、Circle 和 Square。 但是你最终会得到一个适用于所有形状的方法。

如果你只在运行时知道这个类,那么你需要做一些转换:

public void foo(Shape shape) {
   Shape s = new Circle();

   if(Circle.class.isInstance(s)){
      bar(Circle.class.cast(s));
   } else if (Square.class.isInstance(s)){
      bar(Square.class.cast(s));
   }
}

是的,您是正确的,但在run-time会发生多态性。 在编译时它只知道declaration类型。 所以方法参数中应该有相同的类型。

您可以更改如下方法:

public void bar(Shape s) {

  if(s instanceof Circle){

  }else if(s instanceof Square) {

  } 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM