2010-06-18 12 views
5

Chcę utworzyć specyficzną metodę generyczną w Scali. Zajmuje dwa parametry. Pierwszy z nich jest typem ogólnego interfejsu Java (pochodzi z zapytania o kryteria JPA). Obecnie wygląda następująco:Metoda Scala, w której typ drugiego parametru jest równy części rodzaju ogólnego od pierwszego parametru

def genericFind(attribute:SingularAttribute[Person, _], value:Object) { 
    ... 
} 

// The Java Interface which is the type of the first parameter in my find-method: 
public interface SingularAttribute<X, T> extends Attribute<X, T>, Bindable<T> 

Teraz chcę osiągnąć następujące: wartość jest aktualnie typu java.lang.Object. Ale chcę, aby był bardziej szczegółowy. Wartość musi być tego samego typu, co symbol zastępczy "_" z pierwszego parametru (a zatem reprezentuje "T" w interfejsie Java).

Czy to jakoś możliwe i jak?

BTW Przepraszamy za głupi tytuł zapytania (jakieś sugestie?)

EDIT: dodał addtional przykład, który może sprawić, że problemem bardziej jasne:

// A practical example how the Scala method could be called 

// Java class: 
public class Person_ { 
    public static volatile SingularAttribute<Person, Long> id; 
} 

// Calling the method from Scala: 
genericFind(Person_.id, Long) 

Odpowiedz

9

wierzchu moja głowa (wciąż zaczynam od Scala):

def genericFind[T](attribute:SingularAttribute[Person, T], value:T) { 
    ... 
} 
+1

Wow, jestem głęboko impr essed;) Dzięki za szybką odpowiedź. Właściwie to działa. Scala rocks! BTW: nie tak ważne, ale czy byłoby to również możliwe w Javie? – ifischer

+1

Tak, jest to również możliwe w Javie: "publiczna Osoba genericFind (SingularAttribute < Person, T > atrybut, wartość T) {...}". Mam nadzieję że to pomoże :). Zauważ, że istnieją pewne drobne problemy z tym, że na przykład chcesz przekazać podtyp T zamiast instancji dokładnie T. Możesz obejść to z dodatkową adnotacją, ale prawdopodobnie jest poza tym, czego potrzebujesz. – Calum

+0

Dobrze, dobrze wiedzieć, że jest to możliwe w Javie. Nie potrzebuję tej dodatkowej adnotacji, ale chciałbym się dowiedzieć, co to jest! Dzięki – ifischer

Powiązane problemy