两个页面中的任何一个,Interfaces上的那个页面和Visibility Modifiers上的那个页面都没有提供我所遵循的语法的示例,所以我问。
我有这样的界面:
return Json(new { link = "img/Post/" + fileName }, JsonRequestBehavior.AllowGet);
我正在为它编写一个实现,但下面列出的三个语法都不起作用。每次,编译器都会报告以下错误:
'authenticateUser'不会覆盖任何内容
- 醇>
类'DatabaseAuthenticationManager'必须声明为abstract或实现抽象成员public abstract fun authenticateUser(userName:String,password:String,appId:String,appSecret:String):在bookyard.contracts.IAuthenticationManager中定义的OperationResult
import csv
with open('items.csv', 'rB') as f:
csv_reader = csv.reader(f)
for row in csv_reader:
try:
D[row[0]] = [float(x) for x in row[1:]]
except ValueError as e:
D[row[0]] = [float(f) for f in x.split() if f!='None' for x in row[1:]]
答案 0 :(得分:3)
您的问题是,在尝试实现接口时,您正在使用可空字符串。
来自Kotlin's documentation about null-safety ...
Kotlin将在Kotlin中,类型系统区分可以保存null(可空引用)的引用和不能引用null的引用(非空引用)。
String?
(可空字符串)和String
视为不同类型。因此编译器认为您尚未实现该方法。
您有两个选择:
更新您的界面以使用可为空的参数(通过在每种类型的末尾添加?
)。
更新您的实施以使用不可为空的参数(String
)。
我认为选项2稍微更清晰,因为它不会破坏任何其他现有的接口实现。
界面保持不变。
以下是新实施......
package bookyard.server.util
import bookyard.contracts.IAuthenticationManager
class DatabaseAuthenticationManager : IAuthenticationManager<User> {
override fun authenticateUser(userName : String,
password : String,
appId : String,
appSecret : String) : OperationResult<User> {
// Your implementation...
}
}
您可以看到我所做的就是将每个参数从String?
更改为String
。
默认情况下,类/字段/界面公开,public
关键字是不必要的。
Kotlin有分号推断,所以您不需要自己添加分号。有罕见的情况,您实际上需要,但编译器会提前警告您。
答案 1 :(得分:1)
每个重写的方法都需要符合接口声明的参数nullability。换句话说,实现接口的正确方法是:
class DatabaseAuthenticationManager : IAuthenticationManager<User> {
override fun authenticateUser(userName: String, password: String, appId: String, appSecret: String): OperationResult<User> {
...
}
}