Java 数据类型和单元之间的差异

Java 数据类型和单元之间的差异,java,scala,Java,Scala,在编程java或scala时,我遇到了一个错误 type mismatch; found : Unit required: String 因为我的域或实体g/set方法得到了错误 我为什么会犯这个错误?和 我如何克服错误? 例如,我将在scala编程中显示我的实体和错误代码 领域 //@BeanProperty this line commented @Column(name="USERNAME") var userName:String=null def getUs

在编程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
    
如果你知道这些,请与她分享


关于米兰:)

正如蒂洛已经提到的,你的能手就是二传手。如果你想返回用户名,你必须这样写:

def getUsername():String = {
    this.username
}
def getUserName = {
    println("User name was requested.")
    userName
}
重要的是=符号,这意味着函数将返回(在本例中为用户名)<代码>:字符串定义返回类型。没有=它就像java中的
void
方法,但是您的用户对象在这里需要一个字符串,而
getUsername()
是一个没有返回类型(=单位)的函数:


Unit
在本文中的含义与Java中的
void
相同。这意味着:您的
getUserName
方法不返回任何内容。因此,编译器正确地抱怨它不能将
getUserName
(类型
Unit
)的值分配给
字符串
变量

这是因为
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():String = {
    this.username
}
def getUserName = {
    println("User name was requested.")
    userName
}
在等号后面,你会看到一段代码。函数的返回值是在此块内执行的最后一条语句的值。很简单,我们看到它将是
用户名
,这就是我们想要的

与Java一样,您也可以在Scala中使用
return
命令。这是不鼓励的,但由于它的语法支持,我认为它是好的提到它以及。使用
return
语句,您可以编写代码,就像您从Java了解到的一样:

def getUserName() {
    println("User name was requested.")
    return userName
}
注意没有等号。当显式使用
return
语句时,不需要等号


我希望这有帮助。我建议进一步阅读Scala编程语言的语法。任何好的谷歌搜索结果都可以。建议使用Scala主页上链接的资源。为了更深入,我推荐Martin Odersky的关于Scala的书。这很好。

你的getter看起来像setter…如果我们知道
User
UserAccount
@milano的定义可能会有所帮助,但是你能附加User/UserAccount的代码吗?这样我们就可以看看.get*方法是否有任何问题了?“我不知道在scala中实际创建setter和getter”这似乎就是问题所在。单位类似于Java中的void。您显示的“getter”在我看来是“void”。也许您的“getter”应该返回一个字符串?我要补充的是,不带“=”的{}是不受欢迎的,Martin Odersky最近说,它的引入让Java新手看起来更熟悉,但现在它只是一个混淆点谢谢@MikhailGolubtsov,我还不知道!