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()返回 a java.util.List,但您有一个类型注释List[A],默认情况下(来自scala 包对象) a 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 回答