为什么scala需要存在类型来限制泛型绑定?

为什么scala需要存在类型来限制泛型绑定?,scala,types,existential-type,Scala,Types,Existential Type,具有以下类层次结构: trait提供者[A]{ def get():Seq[A] } 抽象类ProviderImpl[A]扩展了提供程序[A]{ 最终覆盖def get():Seq[A]=Seq() } 性状HasX{ def getX:Int } trait-RefinedProvider[A这是由于您使用通配符:\u来声明变量类型:val提供程序:RefinedProvider[\u],\u这意味着任何类型,您可以这样做: val provider = new TypedProviderIm

具有以下类层次结构:

trait提供者[A]{
def get():Seq[A]
}
抽象类ProviderImpl[A]扩展了提供程序[A]{
最终覆盖def get():Seq[A]=Seq()
}
性状HasX{
def getX:Int
}

trait-RefinedProvider[A这是由于您使用通配符
\u
来声明变量类型:
val提供程序:RefinedProvider[\u]
\u
这意味着任何类型,您可以这样做:

val provider = new TypedProviderImpl() // the compiler and IDE will auto infer **provider** type


这是因为您正在使用通配符
来声明变量类型:
val提供程序:RefinedProvider[\u]
表示任何类型,您可以像这样做:

val provider = new TypedProviderImpl() // the compiler and IDE will auto infer **provider** type

票证表明,对于某些人来说,这只是将
A[\u]
解释为
A[T]的规范的一部分
{typet>:没有任何提示提示这只是规范的一部分,可以将
A[]
解释为
A[T]

{type T>:没有什么我认为问题是,为什么scala不使用通配符类型HasX,而我们不能将任何不同于HasX及其子代的东西放入精简提供程序。对我来说,这也是一个谜:)为OP辩护:编译器将
精简提供程序[\u]
解释为
精简提供程序似乎非常合理[;这个例子被简化了:在我的实际用例中,
TypedProviderImpl
是通过依赖项注入传入的一系列类,所以很遗憾,我不能让编译器为我键入它们。我想问题是,为什么scala不使用通配符类型HasX,而我们不能将任何不同于HasX的东西放入到DefinedProvider中对我来说,这也是个谜:)为OP辩护:编译器将
RefinedProvider[\u]
解释为
RefinedProvider似乎非常合理[u这个例子被简化了:在我的实际用例中,
TypedProviderImpl
是一个通过依赖项注入传入的类的完整家族,所以我不能让编译器替我键入它们,很遗憾。谢谢@Jasper-M-实际上,你的评论确实回答了这个问题:票证指向规范,上面说
a[u]
总是等同于
A[Any]
(如果我读得对的话),而且编译器从不应用进一步的边界。我也不知怎么地忘记了
[\uSPEC非常清楚,
\uu
的通配符是
\u>:没什么,谢谢@Jasper-M-事实上,你的评论确实回答了这个问题:票证指向规范,说明
a[\u]
总是等同于
a[任何]
(如果我读得对的话)而且编译器从不应用进一步的边界。我也不知何故忘记了
[\u1]规范非常清楚,
\u1
的通配符是
\u1>:没有
val provider: RefinedProvider[T] forSome { type T <: HasX }
val provider: RefinedProvider[_ <: HasX]