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

4

Unitvoidこのコンテキストでは Javaと同じ意味です。つまり、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。これが私たちが望むものです。

returnJava と同様に、Scalaでもコマンドを使用できます。お勧めしませんが、構文でサポートされているので、言及するのも良いと思います。このreturnステートメントを使用すると、Java で知っているようにコードをプログラミングできます。

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

等号がないことに注意してください。ステートメントを明示的に使用するreturn場合、等号は必要ありません。

それが役立つことを願っています。Scala プログラミング言語の構文についてさらに読むことをお勧めします。適切な Google 検索結果であれば何でも構いません。Scala ホームページにリンクされているリソースはお勧めです。さらに詳しく知りたい場合は、Martin Odersky による Scala に関する本をお勧めします。かなりいい。

于 2013-07-11T10:54:40.120 に答える