Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.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 抽象方法如何在不被重写的情况下返回所需类型?_Java_Android - Fatal编程技术网

Java 抽象方法如何在不被重写的情况下返回所需类型?

Java 抽象方法如何在不被重写的情况下返回所需类型?,java,android,Java,Android,我最近查阅了SurfaceView的android文档,发现要获得实际的SurfaceView,必须执行以下操作: SurfaceView.getHolder().getSurface() 表面支架的文件如下: 现在,从getHolder()返回一个SurfaceHolder,然后您可以调用该holder上的getSurface()来获得一个曲面。现在,如果您检查getSurface()方法,您将看到它是一个抽象方法。我认为抽象方法应该被重写,然后它可以返回愿望类型 但是,这里提供了对一个接口

我最近查阅了SurfaceView的android文档,发现要获得实际的SurfaceView,必须执行以下操作:

SurfaceView.getHolder().getSurface()
表面支架的文件如下:

现在,从getHolder()返回一个SurfaceHolder,然后您可以调用该holder上的getSurface()来获得一个曲面。现在,如果您检查getSurface()方法,您将看到它是一个抽象方法。我认为抽象方法应该被重写,然后它可以返回愿望类型


但是,这里提供了对一个接口的引用,该接口是SurfaceHolder,然后调用getSurface()这是一个抽象方法,意味着没有重写该方法的点。那么,检查并返回相应曲面的代码是如何从抽象方法调用的呢?

您对抽象方法的理解是正确的

您缺少的是getHolder()返回一个具体的实现。抽象基的具体子类,或者在您的情况下,接口的具体实现。函数声明为返回基类/接口,但实际上可以返回任何派生类。这是多态性的主要形式之一:

 Base getThing () { ... }
可以返回一个Base或Base的任何子类/实现

进一步阅读:


返回给您的具体实现可能是一些内部非公开的东西,谁知道呢(我自己不熟悉Android api),但这对您来说并不重要。你不需要确切地知道返回给你的是什么。您只需要知道它实现了surfacehold或其他任何东西。

在运行时实际返回的是一个实现了
surfacehold
的对象。您必须查看运行库中的其他地方,以找出返回的具体对象类型。

哦,好的,我现在知道了,但我仍然关心的是,surfaceHolder实现的抽象基础到底是什么?通常,当android扩展一个接口时,它通常会在文档中告诉您。例如。正如您所看到的,视图正在使用is抽象实现多接口。因此,我可以理解,如果一个视图被认为是一个接口。返回给您的具体实现可能是一些内部非公开的东西,谁知道呢。但关键是这对你来说并不重要。你不需要确切地知道返回给你的是什么。您只需要知道它实现了SurfaceHolder或其他功能。但是,如果您真的想找到只满足您的CUI的方法,可以使用反射打印类名和层次结构,请参阅。