将Java转换为Kotlin扩展抽象类

4
我将转换一个Java类,该类扩展了以下代码中的抽象类。
public class BadRequestAlertException extends AbstractThrowableProblem {

    private static final long serialVersionUID = 1L;

    private final String entityName;

    private final String errorKey;

    public BadRequestAlertException(String defaultMessage, String entityName, String errorKey) {
        this(ErrorConstants.DEFAULT_TYPE, defaultMessage, entityName, errorKey);
    }

    public BadRequestAlertException(URI type, String defaultMessage, String entityName, String errorKey) {
        super(type, defaultMessage, Status.BAD_REQUEST, null, null, null, getAlertParameters(entityName, errorKey));
        this.entityName = entityName;
        this.errorKey = errorKey;
    }

    public String getEntityName() {
        return entityName;
    }

    public String getErrorKey() {
        return errorKey;
    }

    private static Map<String, Object> getAlertParameters(String entityName, String errorKey) {
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("message", "error." + errorKey);
        parameters.put("params", entityName);
        return parameters;
    }
}

按照以下实现进入Kotlin

class BadRequestAlertException(type: URI = ErrorConstants.DEFAULT_TYPE, defaultMessage: String, val entityName: String, val errorKey: String) : AbstractThrowableProblem(type, defaultMessage, Status.BAD_REQUEST, null, null, null, getAlertParameters(entityName, errorKey)) {

    companion object {
        private const val serialVersionUID = 1L

        private fun getAlertParameters(entityName: String, errorKey: String): Map<String, Any> {
            val parameters = HashMap<String, Any>()
            parameters["message"] = "error.$errorKey"
            parameters["params"] = entityName
            return parameters
        }
    }
}

Kotlin 实现会抛出以下错误:Class 'BadRequestAlertException' is not abstract and does not implement abstract base class member public abstract fun getCause(): Exceptional! defined in org.zalando.problem.AbstractThrowableProblem

为什么 Java 版本没有实现 getClause() 方法,但是 Kotlin 要求该方法被重写?这是转换存在问题,还是 Kotlin 扩展抽象类的方式有问题?


4
不可能。如果在AbstractThrowableProblemgetCause()方法是抽象的,那么BadRequestAlertException的Java实现没有覆盖该方法就无法编译。你要么使用了两个不同的AbstractThrowableProblem实现,要么你的Java类确实实现了getCause()方法。 - m0skit0
如果可能,请提供AbstractThrowableProblem类。如果可能,请提供AbstractThrowableProblem类。 - Lino
2
AbstractThrowableProblem 的代码在这里。我基于的 Java 实现 Kotlin 代码在这里 - Jerry
我正在做完全相同的观察。如果您将AbstractThrowableProblem扩展为Kotlin类,则会要求实现getCause。如果您在Java类中执行相同的操作,则没有问题。 - Gie Spaepen
这真的很奇怪。你试过在class之前添加open关键字吗?Kotlin类默认是final的(尽管我不明白为什么这会成为一个问题)。 - Lutosław
1个回答

0

据我的了解,导致此问题的原始错误在 Kotlin 1.5.0 中已得到修复。请参见 KT-45853 ("JVM / IR: 由于从 Java 接口继承 Throwable.getCause 导致的“意外覆盖”") 以获取详细信息... 根据我所知,下面的 Kotlin 类编译并运行正常:


import com.fasterxml.jackson.annotation.JsonIgnore
import java.net.URI
import org.zalando.problem.AbstractThrowableProblem
import org.zalando.problem.Exceptional
import org.zalando.problem.Status

class BadRequestAlertExceptionKt(
    type: URI = URI.create("about:blank"),
    defaultMessage: String,
    val entityName: String,
    val errorKey: String
) : AbstractThrowableProblem(
    type,
    defaultMessage,
    Status.BAD_REQUEST,
    null,
    null,
    null,
    getAlertParameters(entityName, errorKey)
) {
    companion object {
        private const val serialVersionUID = 1L

        private fun getAlertParameters(entityName: String, errorKey: String): Map<String, Any> {
            val parameters = HashMap<String, Any>()
            parameters["message"] = "error.$errorKey"
            parameters["params"] = entityName
            return parameters
        }
    }

    @JsonIgnore
    override fun getCause(): Exceptional? = super.cause
}


顺便提一下,我使用了 type: URI = URI.create("about:blank") 而不是 OP 的 ErrorConstants.DEFAULT_TYPE,因为 ErrorConstants 的定义不可用。 - Mass Dot Net

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接