gpt4 book ai didi

java - 当修改包含泛型的类不是一个选项时,如何修复可怕的类型不匹配 required _$1 ?

转载 作者:行者123 更新时间:2023-12-01 19:36:46 25 4
gpt4 key购买 nike

我正在使用一个 Java 库,一个类定义如下:

public interface Client<C extends Credentials> {
//...
C getCredentials(WebContext context);
Object getUserProfile(C credentials, WebContext context);
}

现在我在 Scala 中写道:

//foundClient: Client[_ <: Credentials]
val credentials = foundClient.getCredentials(context) //returns a _ <: Credentials
val profile = foundClient.getUserProfile(credentials, context)
//compiler not happy because it cannot be sure that the real type of `credentials` is the same as the generic type of `foundClient`

当然,这会抛出发现类型不匹配:credentials.type required:_$1
如果我可以修改 Client 接口(interface),则可以轻松添加 def getUserProfile(context: WebContext) = getUserProfile(getCredentials(context), context) 但我不能.

我尝试过使用 TypeTag,但没有取得多大进展。
另外,奇怪的是 Java 对上面的代码非常满意,就好像没有类型删除一样......

救命!

最佳答案

您的主要问题是编译器无法将您的凭据类型与所需参数连接起来 - 毕竟它们在理论上可能是不同的。通过引入“转发器”来修复客户端参数的类型可以解决此问题:

trait Credential
trait Client[C] {
def credential: C
def getUserProfile(name: String, credential: C): Any
}


object Foo extends App {
val foundClient: Client[_ <: Credential] = ???

def getUserProfile[A](client: Client[A], name: String): Any = {
val credential = client.credential
client.getUserProfile(name, credential)
}

getUserProfile(foundClient, "Foo")
}

关于java - 当修改包含泛型的类不是一个选项时,如何修复可怕的类型不匹配 required _$1 ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57160090/

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