2015-05-25 13 views
5

Sono un po 'perso con questo. Ho un codice (che non ho scritto) che ha una classe chiamata BitSetExt, che estende BitSet. La firma è simile a:Tipo di ritorno incompatibile Java8 IntStream per Collezioni <Integer> .stream()

private class BitSetExt extends BitSet implements Set<Integer> 

Il metodo stream() non viene sovrascritto nella classe estesa. So che il codice si compila bene con Java 1.6. In Eclipse con Java8, ho ricevuto l'errore:

I tipi restituiti non sono compatibili con i metodi ereditati Collection.stream(), BitSet.stream().

Se tento di sovrascrivere stream() e cambio il tipo di ritorno IntStream in qualcosa, ottengo un errore diverso e un suggerimento per cambiare il tipo di ritorno in IntStream (che a quanto pare non è compatibile). Quindi, cosa non sto capendo e come posso risolvere questo codice?

Grazie per qualsiasi aiuto.

risposta

8

Dal Java 8, BitSet ha un metodo dichiarato come

IntStream stream() 

e Set<Integer> ha un metodo con lo stesso nome, dichiarato come

Stream<Integer> stream() 

Dato che tali metodi hanno lo stesso nome, ma un incompatibili tipo di ritorno, impossibile estendere BitSet e implementare Set nello stesso tempo.

Dovrete rifattorizzare la classe in modo che non implementa Set<Integer> più e, ad esempio, aggiungere un metodo che restituisce un vista sopra l'oggetto, attuazione Set<Integer>:

public Set<Integer> asSet(); 
+5

Oppure - possibilmente un'idea migliore - fai in modo che la tua implementazione abbia un 'BitSet' e attui' Set', che è probabilmente un'interfaccia più potente. –

6

Quella classe non potrà mai compilato in Java 8.

Set<Integer> richiede di implementare un metodo con la firma

public Stream<Integer> stream(); 

mentre BitSet fornisce un'implementazione con la firma

public IntStream stream(); 

E un IntStream non è un sottotipo di Stream<integer>. Non esiste un tipo che soddisfi entrambi i requisiti.

+1

Come piccolo supplemento, mentre 'Stream ' e' IntStream' sono entrambe le interfacce, non può esserci un tipo che implementa entrambi allo stesso tempo per una ragione simile - metodi in conflitto, ad esempio 'toArray', rendilo impossibile. Bene, e hanno una dichiarazione di superinterfaccia in conflitto. Pertanto, non è solo impossibile implementare un metodo 'stream()' che restituisce un tipo che soddisfa entrambe le interfacce, anche * dichiarando * che un tale metodo è impossibile. – Holger

Problemi correlati