2016-01-06 146 views
0

我试图找到另一种避免类型不匹配错误的方式,它看起来比我现在使用的错误类型更正确。Scala错误类型不匹配

考虑到列表和功能,分别为:

var l = List[Int]() 

def append[U](cmd: U) = { 
     l = l :+ cmd 
} 

当解释上面的代码中,我发现了以下错误:

<console>:10: error: type mismatch; 
found : List[Any] 
required: List[Int] 
        l = l :+ cmd 
         ^

我固定它,方式是通过修改附加功能的工作是这样的:

def append[U](cmd: U) = { 
    l = (l :+ cmd).asInstanceOf[List[Int]] 
    } 

有没有一种定义应用程序的方法end函数不使用asInstanceOf?

试图更清晰,目标是创建下面的类

abstract class Cstruct{ 
    type T 
    var value: T 
    def append[U](value:U) 
} 

Cstruct应建的方式,将有可能限定延伸Cstruct新的类,但使用不同的数据结构的价值T.与使用任何类型元素的List的Cseq类似,但应该可以使用Set或Map创建类似的元素。

class Cseq[U] (v: U) extends Cstruct{ 
    type T = List[U] 
    var value: T = List[U](v) 
    override def append[U](cmd: U) = { 
    value = (value :+ cmd).asInstanceOf[T] 
    } 
} 
+0

为什么'append'通用?你只能将'Int's(或超类型)附加到'List [Int]' – Lee

回答

2

你得到这个错误,因为你的类型变量U没有限制,可以是任何类型 - 但你尝试U类型的值增加的Int列表。

您的修补程序不是类型安全的。它将允许您尝试添加例如StringList[Int]asInstanceOf会导致编译错误消失,但如果将错误类型的对象添加到列表中,则会在运行时得到ClassCastException

为什么你的方法有一个类型参数?如果该列表始终是一个List[Int],那么它应该只是采取的Int而不是U

def append(cmd: Int) = { 
    l = l :+ cmd 
} 

编辑 - 你可以这样做:

abstract class Cstruct[U] { 
    type T 
    var value: T 
    def append(value: U) 
} 

class Cseq[U](v: U) extends Cstruct[U] { 
    type T = List[U] 
    var value: T = List[U](v) 

    override def append(cmd: U) = 
    value = value :+ cmd 
} 

注意,在你自己的定义Cseq[U]override def append[U]中的U是与在class Cseq[U]处定义的参数不同的类型参数。它恰好有相同的名字U

+0

它不总是List [Int],List [Int]作为例子,append方法有一个类型参数因为它必须是通用的。 – TFR

+0

@TFR看我的编辑。这对你有用吗? – Jesper

+0

谢谢,那就是我正在寻找的。 – TFR