Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定方法';在Java'中使用继承类的签名;s的抽象方法_Java_Oop_Inheritance_Abstract - Fatal编程技术网

确定方法';在Java'中使用继承类的签名;s的抽象方法

确定方法';在Java'中使用继承类的签名;s的抽象方法,java,oop,inheritance,abstract,Java,Oop,Inheritance,Abstract,我知道这是一个非常简单的问题,但我已经在Python中工作了相当长的时间,现在我必须回到Java,我似乎在改变芯片和思考Java的基本多态性方面遇到了问题 是否可以使用继承的类之一作为参数覆盖(准确地说是实现)Java中的类“abstract方法 让我用一个非常简单的例子来解释(遵循“几乎正式”的形状) 有没有办法让Java将CircleDrawer类中的draw方法识别为ShapeDrawer中抽象draw的实现?(毕竟,圆类是从形状扩展而来的) 否则,我想说的是,CircleDrawer类的

我知道这是一个非常简单的问题,但我已经在Python中工作了相当长的时间,现在我必须回到Java,我似乎在改变芯片和思考Java的基本多态性方面遇到了问题

是否可以使用继承的类之一作为参数覆盖(准确地说是实现)Java中的类“
abstract
方法

让我用一个非常简单的例子来解释(遵循“几乎正式”的形状)

有没有办法让Java将
CircleDrawer
类中的
draw
方法识别为
ShapeDrawer
中抽象
draw
的实现?(毕竟,
类是从
形状
扩展而来的)

否则,我想说的是,
CircleDrawer
类的
draw
方法只接受
Circle
类型的实例,但同时,我想告诉Java编译器,
void draw(Circle c)
实际上是抽象方法
抽象void draw(Shape s)的实现
位于其父类中


提前感谢您。

您可以通过泛型解决您的问题:

public abstract class ShapeDrawer<T extends Shape> {
    public abstract void draw(T shape);
}

public class CircleDrawer extends ShapeDrawer<Circle> {
    public void draw(Circle circle) { ... }
}
公共抽象类ShapeDrawer{
公共抽象空图(T形);
}
公共类CircleDrawer扩展ShapeDrawer{
公共空白绘图(圆){…}
}

不,Java方法签名必须完全匹配,不能使用子类型,否则将重载方法而不是重写它


您可以返回子类型,但仅此而已,并且返回类型不是方法签名的一部分。

您不能返回,这是一个很好的理由。拿这个声明来说

public abstract class ShapeDrawer {
    public abstract void draw(Shape s); 
}
现在,获取一些接收
ShapeDrawer
的代码,并尝试使用它:

public void foo(ShapeDrawer drawer, Shape shape) {
    drawer.draw(shape);
}
这段代码应该可以工作,因为
ShapeDrawer
的声明承诺,无论谁实现它,都将提供一个名为
draw()
的方法,该方法可以处理任何
Shape

但如果你被允许这样做:

public class CircleDrawer extends ShapeDrawer {
    public void draw(Circle c) {...}
}
这将不再成立,您的
圆形绘图程序将无法满足它可以处理任何
形状的承诺


然而,想象一下这一宣言:

public abstract class ShapeCreator {
    public abstract Shape create();
}

public class CircleCreator extends ShapeCreator {
    public Circle create() {...}
}
这样行吗

是的,(如果您使用Java 5或更高版本),因为与第一个声明不同,
ShapeCreator
承诺它将有一个名为
create()
的方法,该方法将返回一个
Shape
。由于
Circle
是一个
Shape
,因此
ShapeCreator
的子类可以决定只返回
Circle
s,不会违背任何承诺



那么,你如何实现你想要的呢?请参阅:)

从技术上讲不是,但您可以针对指定的功能对其进行修改

public abstract ShapeDrawer {
    public abstract void draw(Shape s); 
}                       
public CircleDrawer extends ShapeDrawer {
    public void draw(Shape s){
        if (s instanceof Circle) {
            System.out.println("Drawing circle");
        }
    }
}

我可能只是看错了,但如果这不是你想要的,你能举个例子说明你想要什么吗?@Aify,我已经编辑了描述我想要实现什么的问题。希望现在更清楚了?如果不是,请告诉我。在你拔出芯片之前别忘了关机。
public abstract void ShapeDrawer
your'e正在为类声明放置一个返回方法?ShapeDrawer类有两个不同的声明——一个是抽象的,另一个不是。您想要哪一个?这是可以的,但本质上与前面给出的泛型示例相同。如果我要做这样的事情,我更喜欢泛型。它很接近,但还不足以说它是一样的。通过这样做,你仍然可以在技术上通过其他形状,并做其他类型的处理-例如:打印“这不是一个圆”,或类似的东西。但是如果使用泛型,你甚至不能用非圆的东西来调用它。在内部,泛型所做的只是测试与你所做的相似的实例类型。然而,编译器应该阻止你传递任何不是圆的东西,在大多数情况下这是一个巨大的胜利。大多数情况下,就像我说的,这在技术上允许其他处理,而不是直接阻止它。我不知道为什么会有人想要它,但我认为重点在于它是一种选择,而不是它比泛型方法更好@标记空间
public abstract ShapeDrawer {
    public abstract void draw(Shape s); 
}                       
public CircleDrawer extends ShapeDrawer {
    public void draw(Shape s){
        if (s instanceof Circle) {
            System.out.println("Drawing circle");
        }
    }
}