【问题标题】:Class is not abstract and does not implement abstract base class member类不是抽象的,不实现抽象基类成员
【发布时间】:2018-06-06 04:54:55
【问题描述】:

我对这个 Kotlin 错误感到困惑,因为它与为从 maven 包中导入的抽象类提供实现有关。

我有一个用 Kotlin 编写的 maven 库,它公开了一个名为 APIGatewayRequestHandler 的抽象类。在我导入库的应用程序中,我提供了抽象类的实现:

class GetWelcomeMessageHandler : APIGatewayRequestHandler<WelcomeMessage>()
    fun handleAPIGatewayRequest(input: com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent, context: com.amazonaws.services.lambda.runtime.Context?): WelcomeMessage {
        return WelcomeMessage()
    }
}

从库中反编译的抽象类如下所示:

public abstract class APIGatewayRequestHandler<T> public constructor() : com.amazonaws.services.lambda.runtime.RequestHandler<com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent, T> {
    public abstract fun handleAPIGatewayRequest(input: com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent, context: com.amazonaws.services.lambda.runtime.Context?): T

    public open fun handleRequest(input: com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent?, context: com.amazonaws.services.lambda.runtime.Context?): T {
        /* compiled code */
    }
}

我收到以下错误:

Class 'GetWelcomeMessageHandler' is not abstract and does not implement abstract base class member
public abstract fun handleAPIGatewayRequest(input: APIGatewayProxyRequestEvent, context: Context?): WelcomeMessage

【问题讨论】:

    标签: kotlin kotlin-interop


    【解决方案1】:

    我认为您只是缺少一些 override 关键字。即,您的抽象类应该在 handleRequest 方法上拥有它:

    public abstract class APIGatewayRequestHandler<T> public constructor() : com.amazonaws.services.lambda.runtime.RequestHandler<com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent, T> {
        public abstract fun handleAPIGatewayRequest(input: com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent, context: com.amazonaws.services.lambda.runtime.Context?): T
    
        public override fun handleRequest(input: com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent?, context: com.amazonaws.services.lambda.runtime.Context?): T {
            /* compiled code */
        }
    }
    

    然后你的GetWelcomeMessageHandler 应该在它的handleAPIGatewayRequest 方法上有它:

    class GetWelcomeMessageHandler : APIGatewayRequestHandler<WelcomeMessage>() { // <-- This curly brace was also missing
        override fun handleAPIGatewayRequest(input: com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent, context: com.amazonaws.services.lambda.runtime.Context?): WelcomeMessage {
            return WelcomeMessage()
        }
    }
    

    【讨论】:

    • 当我在 GetWelcomeMessageHandler 的 handleAPIGatewayRequest 方法中添加“覆盖”时,出现以下错误:修饰符“覆盖”不适用于“顶级函数”
    • 哦,我刚刚意识到您在 GetWelcomeMessageHandler 声明结束后还缺少 {。请参阅上面我的答案中的编辑。
    • 解决了这个问题,让我可以在方法中添加覆盖。谢谢!错误信息非常具有误导性
    • 确实,关于顶级功能的那个要好得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多