2016-07-02 11 views
1

Ich war Tring zu getDatasID von Factory.java in test.scala zu verwenden.scala Mismatch & abgeleiteten Typ Argumente mit Java

//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> { ... } 

verwenden ich zwei Klasse in 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]) 

Beiden Klassen zeigten gleiche Fehler zu laufen.

  1. abgeleiteten Typ Argumente [Nothing, Nothing A[Key, Value, [K, V]Datas[Key, Value]]] ... [K,V,T <: Datas[K,V]]
  2. Typenkonflikt

    • gefunden nicht entsprechen: class[A[Key, Value, [K,V]Datas[Key, Value]]](classOf[A])
    • erforderlich: Class[T]

Ich möchte die Klasse [Key, Value, Datas [Key, Value]] zuordnen. Der beste Fall ist

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

Der obige Code funktioniert.

Antwort

4

Scala nicht K und V in dieser Situation ableiten können, müssen Sie sie explizit liefern:

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

oder

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

(je nachdem, welche Klasse Sie passieren müssen). Wenn möglich, wäre es besser, Ihre Java-Signatur zu ändern, da es eigentlich nicht K und V verwenden:

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

Vielen Dank !! Es war sehr hilfreich! – MiaeKim

+0

Ich habe gerade "Klasse C" in Java-Datei bei der Frage hinzugefügt. Was ist, wenn ich 'getDatasID' von' Klasse C' brauche? – MiaeKim

+0

@MiaeKim Es ist genau das gleiche wie 'Klasse B'. –

Verwandte Themen