我将转换一个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 扩展抽象类的方式有问题?
AbstractThrowableProblem
中getCause()
方法是抽象的,那么BadRequestAlertException
的Java实现没有覆盖该方法就无法编译。你要么使用了两个不同的AbstractThrowableProblem
实现,要么你的Java类确实实现了getCause()
方法。 - m0skit0AbstractThrowableProblem
类。如果可能,请提供AbstractThrowableProblem
类。 - LinoAbstractThrowableProblem
的代码在这里。我基于的 Java 实现 Kotlin 代码在这里。 - Jerryclass
之前添加open
关键字吗?Kotlin类默认是final的(尽管我不明白为什么这会成为一个问题)。 - Lutosław