gpt4 book ai didi

scala - 如何从类型中提取类型参数

转载 作者:行者123 更新时间:2023-12-05 09:12:36 24 4
gpt4 key购买 nike

给定以下类:

abstract class Foo[B] 
abstract class Baz[B, F <: Foo[B]] {
def get(foo: F): B
// other methods
}

我讨厌在 Baz 中需要两个类型参数,而第一个参数是多余的。我想写这样的东西:

abstract class Baz[F <: Foo[B]] {
def get(foo: F): B
}

我是否可以在不采用多个类型参数的情况下在 Baz 中引用(F 的)B 类型?这感觉应该是可能的,但我似乎无法弄清楚语法。

最佳答案

  1. 你可以让 B 成为类型成员而不是类型参数吗?

    abstract class Foo { type B }
    abstract class Baz[F <: Foo] {
    def get(foo: F): F#B
    // other methods
    }

    然后如果你需要类型参数和类型成员你可以使用辅助模式

    abstract class Foo { type B }
    // Foo.Aux[B] instead of Foo[B]
    object Foo {
    type Aux[B0] = Foo { type B = B0 }
    }
    abstract class Baz[F <: Foo] {
    def get(foo: F): F#B
    // other methods
    }
  2. 你能让 F 更高级并且 get 多态吗? (看起来像是某种“无标记最终”方法。)

    abstract class Foo[B]
    abstract class Baz[F[X] <: Foo[X]] {
    def get[B](foo: F[B]): B
    // other methods
    }
  3. 你能使 Foo 成为类型类吗?

    abstract class Foo[F] {
    type B
    }
    object Foo {
    type Aux[F, B0] = Foo[F] { type B = B0 }
    def instance[F, B0]: Aux[F, B0] = new Foo[F] { type B = B0 }

    //instead of class F1 extends Foo[B1]
    implicit val foo1: Aux[F1, B1] = instance
    }

    abstract class Baz[F](implicit val foo: Foo[F]) {
    def get: foo.B
    // other methods
    }

    abstract class Baz[F: Foo] {
    val foo: Foo[F] = implicitly
    def get: foo.B
    // other methods
    }
  4. 你能把这两个类型参数提取到一个新类中吗?

    abstract class Foo[B]

    abstract class Tuple {
    type B
    type F <: Foo[B]
    }

    abstract class Baz[T <: Tuple] {
    def get(foo: T#F): T#B
    // other methods
    }

    abstract class Baz[T <: Tuple](t: T) {
    def get(foo: t.F): t.B
    // other methods
    }

关于scala - 如何从类型中提取类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57742871/

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