Scala 泛型类型与无界通配符一起使用时,不考虑类型参数绑定

Scala 泛型类型与无界通配符一起使用时,不考虑类型参数绑定,scala,generics,existential-type,bounded-wildcard,Scala,Generics,Existential Type,Bounded Wildcard,在我的项目中,我有这样一个星座: trait F trait X[A <: F] def test(x: X[_]): X[_ <: F] = x def test(x: Option[_]): Option[_ <: String] 我想不出在什么情况下,这项任务会使一个健全的程序变得不健全。此作业被拒绝的原因是什么?有没有一种方法允许这样一个赋值(可能在更复杂的示例中)是有问题的?这个赋值实际上没有问题,编译器甚至知道这一点,因为下面的实现编译时没有问题: trai

在我的项目中,我有这样一个星座:

trait F

trait X[A <: F]

def test(x: X[_]): X[_ <: F] = x
def test(x: Option[_]): Option[_ <: String]

我想不出在什么情况下,这项任务会使一个健全的程序变得不健全。此作业被拒绝的原因是什么?有没有一种方法允许这样一个赋值(可能在更复杂的示例中)是有问题的?

这个赋值实际上没有问题,编译器甚至知道这一点,因为下面的实现编译时没有问题:

trait F
trait X[A <: F]
def test(x: X[_]): X[_ <: F] = x match { case q: X[t] => q }
trait F

trait X[Ai可能是错的,但看看函数本身的定义就足够了:

def test(x: X[_]): X[_ <: F] = x

“据我所知,类型X[]和X[
选项[+A]
不会对类型参数
A
施加任何上界,而
X[A那只是一个更接近现实生活的例子,协方差在其中不起任何作用。如果你通过
X[\ux]
在一种身份函数中,您不能在返回类型中设置限制
,它不是关于差异,而是关于类型上限。如果trait
X
,根据定义,要求其唯一的类型参数是
F
的子类型,那么期望编译器处理
X同义[_
def test(x: Option[_]): Option[_ <: String]
val result: Option[_ <: String] = test(Some(1): Option[_])