【问题标题】:How to extend the following Java class in Scala: class A<T extends Comparable<? super T>>如何在 Scala 中扩展以下 Java 类:class A<T extends Comparable<?超级T>>
【发布时间】:2023-03-15 12:09:01
【问题描述】:

我需要扩展以下类型的 Java 类(来自库):

public class A<T extends Comparable<? super T>> {
}

我尝试将扩展的 Scala 类实现为:

class B[T <: Comparable[_ >: T]] extends A[T] {
}

不幸的是,这个 Scala 类不能用 Scala 2.12.1 编译:

Error:(4, 25) illegal cyclic reference involving type T
class B[T <: Comparable[_ >: T]] extends A[T] {

我该如何解决这个问题?

【问题讨论】:

    标签: java scala


    【解决方案1】:

    您可以尝试为这个嵌套类型定义一个别名:

    object B {
      type ComparableBySuper[LUB] = Comparable[_ >: LUB]
    }
    
    class B[T <: ComparableBySuper[T]] extends A[T]
    

    【讨论】:

    • 就是这样!非常感谢。
    • 永远不要使用小写字符定义类型。
    • @flavian 当然,我这样做只是为了举例
    【解决方案2】:

    这实际上是 Scala 所谓的类型 lambdas 的一个很好的用法,它遵循与公认答案大致相同的方法,但回避了必须将类型嵌套在另一个对象中的要求。

    就 Scala 的所有功能而言,“正确”的做法是:

    class B[T <: ({type LUB[A] = Comparable[_ >: A]})#LUB[T]] extends A[T]
    

    【讨论】:

    • 有趣的解决方案。您只需要在#LUB 之后添加类型参数[T] 即可使其编译: class B[T <: lub comparable>: A]})#LUB[T]]扩展 A[T]
    • @StefanEndrullis 确实很抱歉。
    【解决方案3】:

    用于 IntelliJ IDEA 的 Scala 插件将此代码转换为

    class B[T <: Comparable[(_$1) forSome {type _$1 >: T}]] extends A[T] {
    }
    

    【讨论】:

    • 不幸的是,这段代码产生了同样的编译器错误。
    猜你喜欢
    • 2011-10-05
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多