Entra

View Full Version : [java] Problema utilizzando le interfacce in Java


zar1978
15-03-2011, 15:47
Ho un metodo scritto in questo modo:

public synchronized void executeListFact(List<RulesVariablesInterface> listRV) {
........................
........................
}


Dove RulesVariablesInterface è un'interfaccia. Ho la seguente classe che implementa l'interfaccia:



public class RulesVarIndicatoreEvento implements RulesVariablesInterface {
..............................
..............................
}



Quando invoco il metodo:


public Double compute(List<RulesVarIndicatoreEvento> eventiAssociati) {
Executor.getInstance("nomeIstanza").executeListFact(eventiAssociati);
}

Il compilatore (java 1.6) mi segnala:

The method executeListFact(List<RulesVariablesInterface>) in the type Executor is not applicable for
the arguments (List<RulesVarIndicatoreEvento>)

Qualcuno sa aiutarmi?

Grazie mille

asrm
15-03-2011, 16:39
Il parametro formale di compute è una lista di RulesVarIndicatoreEvento, non gli puoi passare una lista di
RulesVariablesInterface, anche se è l'interfaccia implementata, per la classe degli elementi delle liste
non puoi fare come per gli oggetti(es. RulesVariablesInterface x=new RulesVarIndicatoreEvento() )

zar1978
16-03-2011, 08:06
Il parametro formale di compute è una lista di RulesVarIndicatoreEvento, non gli puoi passare una lista di
RulesVariablesInterface, anche se è l'interfaccia implementata, per la classe degli elementi delle liste
non puoi fare come per gli oggetti (es. RulesVariablesInterface x=new RulesVarIndicatoreEvento() )

Ok, però se utilizzo una lista generic, senza specificare il tipo:


public synchronized void executeListFact(List listRV) {


L'errore scompare!

banryu79
16-03-2011, 08:48
Puoi rendere generici anche i metodi.
Inoltre, i tipi parametrici possono essere dichiarati specificando un bound.
Ad esempio, nel tuo caso, puoi parametrizzare il metodo executeListFact con un type parameter "T" che estenda RulesVariablesInterface.

Ecco come sarebbe la firma di executeListFact:

public synchronized <T extends RulesVariablesInterface>
void executeListFact(List<T> listRV) {
...
}


Così a executeListFact puoi passare come parametro un qualsiasi oggetto di tipo List<T> dove T è un tipo compatibile in assegnamento con RulesVariablesInterface.

zar1978
16-03-2011, 08:53
Puoi rendere generici anche i metodi.
Inoltre, i tipi parametrici possono essere dichiarati specificando un bound (upper bound o lower bound, a seconda).
Ad esempio, nel tuo caso, puoi parametrizzare il metodo executeListFact con un type parameter "T" che estenda RulesVariablesInterface.

Ecco come sarebbe la firma di executeListFact:

public synchronized <T extends RulesVariablesInterface>
void executeListFact(List<T> listRV) {
...
}


Così a executeListFact puoi passare come parametro un qualsiasi oggetto di tipo List<T> dove T è un tipo compatibile in assegnamento con RulesVariablesInterface.

Perfetto è proprio quello che cercavo.

Grazie mille

banryu79
16-03-2011, 08:59
Perfetto è proprio quello che cercavo.

Grazie mille
Prego.
Questa trail (http://download.oracle.com/javase/tutorial/java/generics/index.html) dei Java Tutorials potrebbe esserti utile ;)