繁体   English   中英

Scala不匹配和Java推断的类型参数

[英]scala mismatch & inferred type arguments with Java

我特林使用getDatasIDFactory.javatest.scala

//Factory.java
class Factory {
...
    public <K, V, T extends Datas<K, V>> DatasID<T> getDatasID(Class <T> dataClass) ...
}

// C.java
public class C extends Datas<Key, Value> { ... }

我在Scala中使用了两个类来运行getDatasID

//Test.scala
abstract class A[K, V, T[K, V] <: Datas[K, V]]
abstract class B extends Datas[Key, Value]
val targetA = new Factory()
  .getDatasID(
    classOf[A
        [Key, Value, ({type T[K, V]=Datas[Key, Value})#T] 
])

val targetB = new Factory()
  .getDatasID(classOf[B])

两个类都显示相同的错误。

  1. 推断的类型参数[Nothing, Nothing A[Key, Value, [K, V]Datas[Key, Value]]]不符合... [K,V,T <: Datas[K,V]]
  2. 类型不匹配

    • 找到: class[A[Key, Value, [K,V]Datas[Key, Value]]](classOf[A])
    • 必填: Class[T]

我想匹配class [Key,Value,Datas [Key,Value]]。 最好的情况是

val targetB = new Factory()
  .getDatasID(classOf[B])

上面的代码有效。

在这种情况下,Scala无法推断KV ,您需要明确提供它们:

new Factory.getDatasId[Key, Value, B](classOf[B])

要么

new Factory.getDatasId[Key, Value, A[Key, Value, _ <: Datas[Key, Value]](classOf[A])

(取决于您需要通过的课程)。 如果可能的话,最好更改Java签名,因为它实际上并不使用KV

public <T extends Datas<?, ?>> DatasID<T> getDatasID(Class <T> dataClass)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM