Scala 抽象类型成员的类型推断
编辑2: 还有一个案子Scala 抽象类型成员的类型推断,scala,generics,Scala,Generics,编辑2: 还有一个案子 trait K { type T <: String val s1:T = "some string" // failed } typek={typet我认为这与返回(结果)类型的方差关系有关 请注意,T被接受为输入String type K = {type T <: String} val s1:K#T = "some string" // failed def test(in: K#T):K#T = in // can be used a
trait K {
type T <: String
val s1:T = "some string" // failed
}
typek={typet我认为这与返回(结果)类型的方差关系有关
请注意,T
被接受为输入String
type K = {type T <: String}
val s1:K#T = "some string" // failed
def test(in: K#T):K#T = in // can be used as output type as well
但是将T
-转换为-字符串
关系,这样就可以
def s3[T <: String](s:T):T = "some string" // fails to compile
// ^^^
…这也是
def s3[T >: String](s:T):T = "some string" // T as input and output
s3("blah")
问题不在于T
不能是一个字符串,而是它可能是另一个字符串,不能为其分配字符串(例如Null
或Nothing
)。k.T
是a。对于k
的每个实例k
,它都可能不同
val s1: ({type T >: String})#T = "some string" // good
trait K{
键入T,但当我执行类似操作时:def tt[T不应该被推断为String?不,不应该。这里的T
不是类型参数,推断它没有意义。关于输入:def tt(T:({type T and btw T
def s3[T >: String](s:T):T = "some string" // T as input and output
s3("blah")
val s1: ({type T >: String})#T = "some string" // good
trait K {
type T <: String
val s1: T /*= "some string"*/
}
object K1 extends K {
override type T = Null
override val s1 = null
}
object K2 extends K {
override type T = Nothing
override val s1 = ???
}
object K3 extends K {
override type T = String with Int
override val s1 = ???
}
object K4 extends K {
override type T = shapeless.Witness.`"some other string"`.T
override val s1 = "some other string"
}
object K5 extends K {
// K5.T is abstract
override val s1 = ???
}
object K6 extends K {
// K6.T is abstract but different from K5.T
override val s1 = ???
}