作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用一个 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/
我们在 session 中存储两个对象。不知何故,来自另一个用户的对象之一被加载到另一个用户的 session 中。用户应该无权访问此特定数据,一旦他们看到它,他们就知道出了什么问题。 我们有向他提供
我现在正在使用 Firefox 5 检查我的网站,我发现字体的呈现很糟糕。 这就是 Firefox (5) 和 Chrome 之间的区别:例如,看看文本 Jeffe 是如何呈现的... 默认字体系列是
我是一名优秀的程序员,十分优秀!