gpt4 book ai didi

c# - Scala 中的泛型 : implementing an interface/trait twice?

转载 作者:搜寻专家 更新时间:2023-10-30 21:02:58 25 4
gpt4 key购买 nike

给定一个通用接口(interface),如下所示

interface I<T> {
void m(T t);
}

我可以在 C# 中创建一个类,该类使用为 T 提供的不同类型实现 I 两次(或更多次),例如

class C : I<int>, I<String> {
public void m(int i) { }
public void m(String s) { }
}

由于通用类型信息的删除,这在 Java 中无法完成,但是在 Scala 中可以实现这样的事情吗?

最佳答案

没有。只有当特征(接口(interface))被参数化为彼此符合的类型并且特征没有两次混合到同一个类中时,才能在 Scala 中混合相同的特征直接。为确保这 2 种类型彼此一致,您通常必须使类型参数协变 (+)。

例如,这是不允许的:

scala> trait A[+T] { def foo: T = sys.error() }
defined trait A

scala> class C extends A[AnyRef] with A[String]
<console>:8: error: trait A is inherited twice
class C extends A[AnyRef] with A[String]

但这是:

scala> trait A[+T] { def foo: T = sys.error() }
defined trait A

scala> class C extends A[AnyRef]
defined class C

scala> class B extends C with A[String]
defined class B

请注意,在这种情况下,您不会像 C# 那样获得重载 语义,而是获得覆盖 语义 - A< 中的所有方法 具有符合要求的签名将被融合到一个具有最具体签名的方法中,根据 linearization rules 选择方法。 ,而不是每次混合特征时都使用一种方法。

关于c# - Scala 中的泛型 : implementing an interface/trait twice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7565673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com