gpt4 book ai didi

generics - 如何使用涉及泛型的匿名类型调用泛型方法?

转载 作者:行者123 更新时间:2023-12-04 04:39:31 25 4
gpt4 key购买 nike

我有下面的代码可以工作:

  def testTypeSpecialization: String = {
class Foo[T]

def add[T](obj: Foo[T]): Foo[T] = obj

def addInt[X <% Foo[Int]](obj: X): X = {
add(obj)
obj
}

val foo = addInt(new Foo[Int] {
def someMethod: String = "Hello world"
})

foo.someMethod
}

但是,我想这样写:
 def testTypeSpecialization: String = {
class Foo[T]

def add[X, T <% Foo[X](obj: T): T = obj

val foo = add(new Foo[Int] {
def someMethod: String = "Hello world"
})

foo.someMethod
}

第二个编译失败:

找不到与参数类型(Foo [Int] {...})匹配的隐式参数=> Foo [Nothing]。

基本上:
  • 我想创建一个新的匿名用户
    即时更新类(class)/实例(例如新的
    Foo [Int] {...}),并将其传递给
    一个“添加”方法,将其添加到
    列表,然后将其返回
  • 这里的关键是
    我想从“val foo =”中获取变量
    其类型为匿名类,
    不是Foo [Int],因为它添加了方法
    (在此示例中为someMethod)

  • 有任何想法吗?

    我认为第二个失败,因为类型Int被删除了。我显然可以像这样“提示”编译器:(这可行,但看起来像个hack)
      def testTypeSpecialization = {
    class Foo[T]

    def add[X, T <% Foo[X]](dummy: X, obj: T): T = obj

    val foo = add(2, new Foo[Int] {
    def someMethod: String = "Hello world"
    })

    foo.someMethod
    }

    最佳答案

    达里奥(Dario)建议在Foo中使T为协变量:

    def testTypeSpecialization: String = {
    class Foo[+T] {
    var _val: Option[T]
    }

    def add[X, T <% Foo[X](obj: T): T = obj

    val foo = add(new Foo[Int] {
    def someMethod: String = "Hello world"
    })

    foo.someMethod
    }

    但是,这给Foo增加了太多限制,例如我不能拥有Option [T]类型的var成员变量。

    协变类型T出现在setter val = 参数的Option [T]类型的反位置

    关于generics - 如何使用涉及泛型的匿名类型调用泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2813650/

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