斯卡拉不匹配&使用Java推断类型参数

时间:2016-07-02 03:40:28

标签: java scala

我想在getDatasID中使用Factory.java中的test.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]
  3. 我想匹配类[键,值,数据[键,值]]。最好的情况是

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

    以上代码有效。

1 个答案:

答案 0 :(得分:4)

在这种情况下,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)