scala - 将 `T[_ <: U]` 转换为 `T[U]`

标签 scala covariance

我有一个java类型public interface T<U> ,它是不可变的且逻辑协变的(只读),但在 scala 中是不变的,因为它是在 Java 中定义的。

我可以安全地施放 T[_ <: U]T[U] ?如果是这样怎么办?

最佳答案

immutable and logically covariant (read-only)

只读和不可变并不意味着它是“逻辑协变”!例如。 Consumer<A> (Scala 中的 A => Unit )是只读且不可变的,但它应该是逆变的。所以答案是,这取决于情况。

it's a collection/iterator-ish type with methods like public U next() so still covariant

为了协变,它不应该有方法检查 U 类型的值(除了使用 hashCodeequals ),例如List.add可以(对于不可变列表),HashSet.contains没问题,TreeSet.contains不是。

假设这一点成立,则 Actor 阵容是安全的。当然,Scala 的编译器无法知道它,所以你仍然需要 asInstanceOf :

val t1: T[SomeSubtypeOfU] = ...
val t2 = t1.asInstanceOf[T[U]]

您可以将其隐藏在隐式转换后面:

implicit def tIsCovariant[A](x: T[_ <: A]): T[A] = x.asInstanceOf[T[A]]

关于scala - 将 `T[_ <: U]` 转换为 `T[U]`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42906447/

相关文章:

scala - 协方差和方法参数

scala - 如何检查函数中元素的协变和逆变位置?

c# - 同时使用值和引用类型的泛型的协方差解决方法

scala - 为什么 scala 不能从特征中识别方法

scala - 如何使用 2d GUI (nifty-gui) 正确渲染 3d 对象?

Scala 将迭代方法转换为 Iterator 的函数式方法

javascript - Javascript 中 Scala 的 "for comprehension"

scala - 如何在 Play Framework 上配置 ssl 证书?

c# - 协方差如何比多态性更酷……而不是多余的?

Java 类型转换问题