英文:
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) {
}
}
英文:
Why is this an invalid syntax?
I thought polymorphism will occur in this example.
The shape could be known only in runtime and it should be dispatched to the correct method.
Why won't this work?
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) {
}
}
答案1
得分: 2
你应该使用 Circle 引用而不是 Shape:
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));
}
}
英文:
You should be using Circle reference instead of Shape:
public void foo(Shape shape) {
Circle s = new Circle();
bar(s);
}
In method foo
variable s
is a Shape
class. And your bar
methods expect only one of two : Circle or Square.
Your code would work if you create a method that receives a Shape
public void bar(Shape c) {
}
But because it is missing, the compiler throws an exception.
To above method you could pass references of: Shape, Circle and Square. But then you will end up with a single method for all shapes.
If you know the class only in the runtime, then you need to do some casting:
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));
}
}
答案2
得分: 0
是的,你说得对,多态性将会发生,但是是在运行时
。在编译时它只知道声明
的类型。所以方法参数中应该是相同的类型。
你可以像下面这样修改方法:
public void bar(Shape s) {
if(s instanceof Circle){
}else if(s instanceof Square) {
}
}
英文:
Yes you are correct polymorphism will occur but at run-time
. At compile time it only knows the declaration
type. So there should be the same type in the method argument.
You can change the method like below:
public void bar(Shape s) {
if(s instanceof Circle){
}else if(s instanceof Square) {
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论