数据类型和单位之间的差异

时间:2013-07-11 10:30:33

标签: 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 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:)

2 个答案:

答案 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.userNameuserName引用完全相同的实例变量。因此,您只需使用之前包含的相同值覆盖userName的值。

以下是我假设您正在考虑的问题:“this.userNamegetUserName的返回值,因此我需要为其分配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一书。这很不错。