2012-03-10 10 views
1

このコードの出力がではなくtrue trueである理由を説明することはできますか?Scala:isInstanceOfの汎用抽象タイプが無視される

true falseを使用して出力を達成する方法を知りたいと思います。def apply(in:Any)を使用してください。私もパラメータ化された型を試したが、それでもtrue falseの代わりにtrue trueを得る。

object TestClass extends App { 

    val xTrue = TypeXObject(TypeX("s")) 
    val xFalse = TypeXObject(TypeY(1)) 
} 

case class TypeX(string:String) 

case class TypeY(int:Int) 

object TypeXObject extends HasAbstractType{override type T = TypeX} 

object TypeYObject extends HasAbstractType{override type T = TypeY} 

abstract class HasAbstractType { 
    type T 
    def apply(in:Any):Any = { 
    println(in.isInstanceOf[T]) 
    in 
    } 
} 

回答:

issues.scala-lang.org/browse/SI-5042 - 記事と私はmanifest[T1].erasure.isInstance(t1)manifest[T1].erasure.isInstance(t2)true falseを得ることができることを見出した付属品付き。

答えて

7

私は次のコンパイラメッセージを取得するコードをコンパイルする場合:コンパイラに-uncheckedを渡すには

[warn] there were 1 unchecked warnings; re-run with -unchecked for details 
[warn] one warning found 

を、私は含むbuild.sbtを作成します。

scalacOptions ++= Seq("-unchecked", "-deprecated") // (I threw in deprecated for good measure) 

それから私は、コンパイル時に、私はこの啓発の警告を受ける:

[warn] /home/lwickland/f/f.scala:18: abstract type HasAbstractType.this.T in type HasAbstractType.this.T is unchecked since it is eliminated by erasure 
[warn]  println(in.isInstanceOf[T]) 

そしてその時点で、私はo excellent explanation of type erasureに連絡し、回避する方法を教えてください。

+1

https://issues.scala-lang.org/browse/SI-5042 - あなたの記事とこの記事では、 'manifest [T1] .erasure.isInstance(t1)で' true false'を得ることができました。 'と'マニフェスト[T1] .erasure.isInstance(t2) 'を実行します。助けてくれてありがとう – George

関連する問題