【发布时间】:2020-03-27 15:23:19
【问题描述】:
我有这个程序:
object B{
def apply[T](c:T)={}
}
object C{
type T
def apply(c:T)={}
}
object A extends App{
val d=B{println(1);2}
val e=C{println(1);2}
}
一行
val e = C{println(1);2}
告诉我错误:类型不匹配,预期 C.T,实际:2
为什么我不能写
type T
def apply(c:T)
好像是一样的
apply[T](c:T)
我写的时候T是什么类型
val d=B{println(1);2}
我可以在这里写很多行!
因为T表示泛型,所以可以是Int,String,用户自定义类Apple,Orange...
什么是类型
println(1);2
是否有“代码行”类型?
谢谢!
【问题讨论】:
-
在
def apply[T](c: T)中,T 的意思是“无论c在每次调用中的类型”。而在第二个示例中, T 已经设置为 (在您的具体示例中,编译器可能推断出 Any 或 Nothing 因为您没有指定). -
块的类型是块上最后一个表达式的类型。因此
{ println(...); 2 }的类型为 Int。 -
@LuisMiguelMejíaSuárez 其实我不认为
T会被推断为Any或Nothing,我想它会保持抽象。错误是“找到:Int(2);需要:C.T”而不是“找到:Int(2);需要:Nothing”或“找到:Int(2);需要:Any”stackoverflow.com/questions/11274533/…@987654322 @
标签: scala generics types type-inference type-members