首页 > 解决方案 > 将类的子类作为类型参数传递(类型参数是子类)

问题描述

让我们考虑一下:

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 如何解决的呢?

标签: javascalagenericsscala-java-interopf-bounded-polymorphism

解决方案


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

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


推荐阅读