1

让我们考虑一下:

public class Text extends BinaryComparable
    implements WritableComparable<BinaryComparable> {

我们可以看到Text BinaryComparable

那么,我们来考虑

@InterfaceAudience.Public
@InterfaceStability.Stable
public interface WritableComparable<T> extends Writable, Comparable<T> {

我在 Scala 中有一些课程:

trait MyClass[A <: WritableComparable[A]] {

无法创建

MyClass[Text] = new MyClass[Text]()

由于类型不匹配。为什么?毕竟TextBinaryComparable 如何解决的呢?

4

2 回答 2

2

您可以尝试再添加一个类型参数

trait MyClass[B >: A, A <: WritableComparable[B]]

val mc: MyClass[BinaryComparable, Text] = new MyClass[BinaryComparable, Text] {}

与此相反,trait MyClass[A <: WritableComparable[_ >: A]]不会产生illegal cyclic reference.

或者,您可以将边界定义MyClass

trait MyClass[B, A <: B with WritableComparable[B]]

val mc: MyClass[BinaryComparable, Text] = new MyClass[BinaryComparable, Text] {}

您甚至可以B使用存在类型排除(如@user建议的那样)

trait MyClass[A <: B with WritableComparable[B] forSome { type B }]

val mc: MyClass[Text] = new MyClass[Text] {}

这样的存在类型将在 Scala 3 中被弃用

http://dotty.epfl.ch/docs/reference/dropped-features/existential-types.html

于 2020-10-31T01:16:57.130 回答
2

WritableComparable[BinaryComparable]与 的 不同或其超类型WritableComparable[Text],因为WritableComparable它是不变的T(Java 泛型实际上没有协变或逆变)。

如果WritingComparable被声明为trait WritingComparable[-A],那么它将编译

但是,您的最后一个代码片段没有多大意义,因为MyClass它不采用 2 个类型参数(正如 Luis Miguel Mejia Suarez 所提到的)。您不应该收到类型不匹配错误,它应该告诉您参数太多。我想你的意思只是MyClass[Text].

是一个关于不变性、逆变性和协变的问题。

于 2020-10-30T17:28:40.063 回答