2

私はScalaを初めて使用するので、これは非常に明白な間違いである可能性があります。ただし、List[Object]をList[A]にキャストしようとしています。ここで、Aはクラスのパラメーターです。

class AbstractHibernateDAO[A<:Serializable]{
  def findAll: List[A] = {
    val objList = currentSession.createQuery("from " + clazz.getName()).list()
    objList.map{_.asInstanceOf[A]}
  }
}

Eclipseが吐き出している:

type mismatch;  found   : ?0(in method findAll) => A where type ?0(in method findAll)  required: (some other)?0(in method findAll) => ? where type (some other)?0(in method findAll)    AbstractHibernateDAO.scala  /springHibernateNoXML/src/main/scala/my/package

ロングフォームも試してみました

objList.map{obj => obj.asInstanceOf[A]}

同じ結果が得られます。

誰か私に手を貸してもらえますか?

[編集-追加情報]

リクエストした人のために、ここに完全なリストがあります:

package name.me


import java.io.Serializable
import java.util.List
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.config.BeanDefinition
import org.springframework.context.annotation.Scope
import org.springframework.orm.hibernate3.HibernateTemplate
import org.springframework.stereotype.Repository
import com.google.common.base.Preconditions
import org.hibernate.SessionFactory
import org.hibernate.Session
import collection.JavaConversions._

@Repository
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
class AbstractHibernateDAO[A<:Serializable]{

  val clazz: Class[A] = null
  @Autowired val sessionFactory: SessionFactory = null

  def currentSession: Session = {
    sessionFactory getCurrentSession
  }

  def findOne(id: Long): A = {
    Preconditions checkArgument(id != null)
    currentSession.get(clazz, id).asInstanceOf[A]
  }

  def findAll: List[A] = {
    val objList = currentSession.createQuery("from " + clazz.getName()).list()
    objList.map(_.asInstanceOf[A])
    //This works
    //objList.asInstanceOf[List[A]]
  }

  def save(entity:A){
    Preconditions checkNotNull entity
    currentSession persist entity
  }

  def update(entity: A){
    Preconditions checkNotNull entity
    currentSession merge entity
  }

  def delete(entity: A){
    Preconditions checkNotNull entity
    currentSession delete entity
  }

  def deleteById(entityId: Long){
    Preconditions checkNotNull entityId
    val entity = findOne(entityId) 
    Preconditions checkNotNull entity
    delete(entity)
  }
}
4

2 に答える 2

3

種類はわかりますかobjList?それは本当にscala.collection.immutable.Listjava.util.Objectですか?変数宣言に型を追加することで、これを簡単に確認できます。

val objList: List[java.util.Object] = ...

それが正しいと仮定すると、コードは問題ないようです。しかし、他のすべてのコードがないと実行できません。私はあなたが試みていることを簡単な例で行うことができます:

def convertAll[A](data: List[java.lang.Object]): List[A] =
  data.map(_.asInstanceOf[A])

convertAll[java.lang.Integer](List(1,2).map(new java.lang.Integer(_)))
// List[java.lang.Integer] = List(1, 2)

ただし、の各アイテムをキャストする必要はありませんList。リストを新しいタイプにキャストしてみてください。

objList.asInstanceOf[List[A]]

例えば:

val x: List[java.lang.Object] = List(1,2).map(new java.lang.Integer(_))
x.asInstanceOf[List[java.lang.Integer]]
// List[java.lang.Integer] = List(1, 2)
于 2012-04-22T17:04:27.903 に答える
2

Hibernate APIのドキュメントをざっと見てみると、がをQuery.list()返すことがわかりjava.util.Listますが、タイプアノテーションはList[A]デフォルトで(scalaパッケージオブジェクトから)scala.collection.immutable.Listです。

どちらに戻りたいですか?

Javaリストの場合、タイプアノテーションを変更し、リスト全体をキャストします。

class AbstractHibernateDAO[A<:Serializable]{
  def findAll: java.util.List[A] = {
    val objList = currentSession.createQuery("from " + clazz.getName()).list()
    objList.asInstanceOf[java.util.List[A]]
  }
}

Scalaリストには、JavaConversionsを使用します。

class AbstractHibernateDAO[A<:Serializable]{
  def findAll: List[A] = {
    val objList = currentSession.createQuery("from " + clazz.getName()).list()
    import collection.JavaConversions._
    objList.toList.asInstanceOf[List[A]]
  }
}
于 2012-04-22T19:23:54.173 に答える