2012-04-22 20 views
2

私はScalaを初めて使うので、これは非常に明白な間違いである可能性があります。しかし、List [Object]をList [A]にキャストしようとしています。ここで、Aはクラスのパラメータです。スカラマップメソッドが期待通りに動作しない

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]} 

を試みたと同じ結果を得る:

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

Eclipseがアップ吐いています。

誰も私に手を差し伸べることはできますか?

- 要求されたものについては、[EDIT追加情報]

、ここでの完全なリストがあります:あなたはobjListの種類の確認

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) 
    } 
} 
+0

? –

答えて

2

Hibernate API docsで簡単に見にQuery.list()java.util.List返すことを示しているが、あなたはList[A]の型注釈を、持っていますデフォルトでは(scala package objectから)scala.collection.immutable.Listです。

戻したいのはどちらですか? JavaのListの

、あなたのタイプの注釈を変更して、リスト全体キャスト:ScalaのListの

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

は、JavaConversionsを使用する: `clazz`が定義されて

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

私はscala.collection.immutable.Listを返したいと思います。私はJavaを受け取っているはずです。util.List (少なくともこれは私の理解です)。私はこれをscala.collection.immutable.List に動的にアップキャストしたいと思います。 – babbitt

+0

@babbittよく、私はこの答えで示唆するようにしてください。 JavaConversionsで暗黙的にjava.util.ListをScala ListではなくBufferに変換し、ListがBufferのサブクラスではないため、マップとキャストだけでは機能しない理由は、キャスト失敗するでしょう。だからそこに 'toList'が必要です。 –

+0

ありがとうございます。今日の午後に、このプロジェクトに戻ってきます。 – babbitt

3

ていますか?それは本当に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) 
+0

リストがList [java.lang.Object]であることを検証しようとしましたが、それはJava.util.List [?0]型であることがわかりました。私はcollection.JavaConversions._を持っています、私はscala.collection.immutable.Listに動的アップキャストを提供していたと推定しています。リスト全体をキャスティングしました。 – babbitt

+0

@babbit実行時にClassCastExceptionが発生しないことを確認してください。 (REPLで試してみるので) –

+0

@Luigiいいえ、わかりません。私は、提案されたコードの変更を行うのに数分しかかからず、Eclipseのエラーが解決されたことが分かりました。まだテストを実行していません(私のテストスイートをjavaから変換する必要があります)。 – babbitt

関連する問題