当编程java或scala中的一些情况时出现错误
type mismatch; found : Unit required: String
因为我的域名或实体g / set方法出错了。
为什么我收到此错误?和
我如何克服错误?
例如,我将在scala编程中显示我的实体和错误代码
域
//@BeanProperty this line commented
@Column(name="USERNAME")
var userName:String=null
def getUserName() {
this.userName = userName
}
//@BeanProperty
@Column(name="PASSWORD")
var password:String=null
def getPassword() {
this.password = password
}
def setPassword(password:String) {
this.password = password
}
错误到了
@Transactional(propagation = Propagation.REQUIRED )
def loadUserByUsername(userName: String): UserDetails = {
log.info("==>calling loadUserByUsername for the user " + userName);
val userAccount: UserAccount = findUserAccount(userName);
new User(userAccount.getUserName(), userAccount.getPassword(),
here error ---^ ^---- and here
true, true, true, true, getGrantedAuthorities(userAccount));
}
编译错误显示:
Multiple markers at this line
- type mismatch; found : Unit
required: String
如果你知道关于这些,请分享她..
关心MILANO:)
答案 0 :(得分:6)
正如Thilo已经提到的那样,你的吸气者是安装者。如果你想返回,例如您必须写下这样的用户名:
def getUsername():String = {
this.username
}
重要的是 = 符号,这意味着该函数将返回(在本例中为用户名)。 :String
定义了返回类型。如果没有 = ,它就像java中的void
方法,但是你的User对象需要一个String,而你的getUsername()
是一个没有返回类型的函数(= Unit):
new User(userAccount.getUserName(), userAccount.getPassword())
答案 1 :(得分:4)
Unit
在此上下文中与Java中的void
相同。这意味着:您的getUserName
方法不会返回任何内容。因此,编译器正确地抱怨它无法将getUserName
(类型为Unit
)的值赋给String
变量。
这是因为getUserName
方法中存在错误。它没有做你想做的事。我建议这是因为对如何返回和分配值的误解。我们先来看看你的示例方法:
def getUserName() {
this.userName = userName
}
首先,请注意,在此上下文中,this.userName
和userName
引用完全相同的实例变量。因此,您只需使用之前包含的相同值覆盖userName
的值。
以下是我假设您正在考虑的问题:“this.userName
是getUserName
的返回值,因此我需要为其分配userName
,以便调用者获得此值作为回报。“
这就是我对上述误解的意思。在Scala中,您不会将函数的返回值赋给变量。而是将函数本身分配给值。看看这个:
def getUserName() = userName
这意味着你想要的。
不仅如此,在Scala中,如果方法不修改对象的状态,通常会在方法名后面省略()
。这意味着我们写道:
def getUserName = userName
但是,更改对象内部状态的方法应该具有()
。例如:
def resetUserName() {userName = ""}
现在,大括号呢?
让我举个例子。假设您希望每次调用getter时都向控制台写入消息。也许是为了调试。你的方法看起来像这样:
def getUserName = {
println("User name was requested.")
userName
}
在等号后面,您会看到一段代码。函数的返回值是在此块中执行的最后一个语句的值。很简单,我们看到它将是userName
,这就是我们想要的。
与Java类似,您也可以在Scala中使用return
命令。不鼓励,但由于它受语法支持,我认为提及它也是好事。使用return
语句,您可以像从Java中了解的那样对代码进行编程:
def getUserName() {
println("User name was requested.")
return userName
}
注意没有等号。明确使用return
语句时,不需要等号。
我希望有所帮助。我建议进一步阅读Scala编程语言的语法。任何好的Google搜索结果都可以。 Scala主页上链接的资源是值得推荐的。为了更深入,我推荐Martin Odersky的Scala一书。这很不错。