Originariamente inviato da 87Fra87
Quindi detta in parole povere la funzionalità più importante delle interfacce è quella di Creare classi che possano gestire oggetti generici scegliendo quello più opportuno a runtime giusto?
Inoltre se una classe A implementa due interface ex Runnable e Comparable e una classe B ha il seguente metodo:
gestisci(Runnable c){

Runnable[] b = c.run() //metodo che istanzia e restituisce deu oggetti di tipo Runnable
b[0].compareto(b[1])

}
Lo posso fare se l'oggetto passatoli oltre ad implementare l'interfaccia Runnuble implementa anche l'interfaccia Comparable o no?
In linea di massima, le interfacce esprimono "cosa fa quest'oggetto" e le classi "come lo fa". Ed ovviamente un oggetto può essere in grado di fare diverse cose anche completamente scollegate fra loro, implementando di conseguenza più interfacce.

Puoi passare un oggetto che implementa entrambe le interfacce ad un metodo che si aspetta un parametro di tipo Runnable, ma quello che fai dentro al metodo è sbagliato: intanto il metodo run non dà nessun valore di ritorno, e poi b[0] avrebbe tipo Runnable il quale NON comprende il metodo compareTo. Se hai bisogno di un parametro che sia sottotipo sia di Runnable che di Comparable<Runnable> (o quello che ti pare come tipo generico), è meglio usare i generici:

codice:
<T extends Runnable & Comparable<Runnable>> void foo(T object)
{
  object.run();
  object.compareTo(object);
  ...
Senza i generici dovresti fare controlli a run-time con instanceof, ma da Java 5 in poi non c'è motivo di non usarli, anzi.

Se specifchi come tipo solamente Runnable, non puoi sfruttare le caratteristiche di Comparable, e viceversa. Se le vuoi entrambi devi specificarle tutte e due.

Utilizza il tag [CODE].