Scala 抽象类型成员的类型推断

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

编辑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 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 = ???
}