0

当某些情况下在编程 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
    

如果你知道这些请分享她..

问候米兰 :)

4

2 回答 2

6

正如 Thilo 已经提到的,您的吸气剂是二传手。如果您想返回例如用户名,您必须编写如下内容:

def getUsername():String = {
    this.username
}

重要的是=符号,这意味着该函数将返回(在本例中为 username )。:String定义返回类型。没有=,它就像voidjava中的一个方法,但是你的用户对象在这里需要一个字符串,而你的getUsername()是一个没有返回类型(=单位)的函数:

new User(userAccount.getUserName(), userAccount.getPassword())
于 2013-07-11T10:48:10.537 回答
4

Unit在此上下文中的含义与voidJava 中的含义相同。这意味着:您的getUserName方法不返回任何内容。因此,编译器正确地抱怨它不能将getUserName(of type Unit)的值分配给String变量。

这是因为方法有误getUserName。它没有做你想让它做的事情。我认为这是因为对如何返回和分配值的误解。让我们先看一下您的示例方法:

def getUserName() { 
  this.userName = userName 
}

首先,请注意在此上下文中,this.userNameuserName引用完全相同的实例变量。因此,您只是用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 中一样,您也可以return在 Scala 中使用该命令。不鼓励这样做,但由于它受到语法的支持,所以我认为也可以提及它。使用该return语句,您可以像在 Java 中一样编写代码:

def getUserName() {
    println("User name was requested.")
    return userName
}

注意没有等号。当您显式使用该return语句时,您不需要等号。

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

于 2013-07-11T10:54:40.120 回答