salve questo è il mio post e lo uso per quello che è l'argomento bello ostico dei generici...
l'esercizio mi passa un interfaccia generica :
public interface Insieme<T extends Comparable<? super T>> extends Iterable<T>{
boolean vuoto();
boolean pieno();
boolean aggiungi(T x);
boolean rimuovi(T x);
boolean appartiene(T x);
boolean sottinsieme(Insieme<T> y);
Insieme<T> unione(Insieme<T> y);
Insieme<T> intersezione(Insieme<T> y);
Insieme<T> differenza(Insieme<T> y);
Insieme<T> differenzaSimmetrica(Insieme<T> y);
}
devo scrivere un metodo InsiemeAstratto e fornisce concretizzazione per quanti più metodi possibili(poi dovrò scrivere una classe concreta InsiemeHashSet)
comincio a scrivere la classe astratta e decido quali metodi concretizzare e non...:
devo concretizzare gli ultimi 4 metodi dell'interfaccia.public abstract class InsiemeAstratto<T> implements Insieme{
public abstract boolean vuoto();
public abstract boolean pieno();
public abstract boolean aggiungi(T o);
public abstract boolean rimuovi(T o);
public abstract boolean appartiene(T o);
public abstract boolean sottoinsieme(T o);
public abstract Insieme<T> creaInsieme();
public abstract T[] elementi(T x);
public abstract int compareTo(T o);
quelli in rosso sono metodi che aggiungo io per semplificarmi la vita...
fin quì ci sono errori??? in teoria i metodi astratti con parametro T li concretizzo più avanti,e quindi li lascio così, invece gli altri 3 dovrebbero essere(sempre da concretizzare in seguito):
1) crea un oggetto insieme<t> da utilizzare poi negli altri metodi.
2) trasforma la collections generica x di tipo T in un array di tipo T
3) il compare to applicato ad un oggetto di tipo T.
ora vado a scrivere la classe unione per concretizzarla...prende un insieme<T> e unito ad un altro insieme, ne ritorna uno nuovo, quindi scrivo:
il metodo praticamente nn fa nessuna operazione in realtà vorrei prima vedere se scrivo bene il codice ed infatti mi da un errore:public Insieme<T> unione(Insieme<T> i){
Insieme<T> nuovo = creaInsieme();
return nuovo;
}
D:\java\poo\ProveAppelli\Appello17_4_07\InsiemeAst ratto.java:12: type parameter T is not within its bound
public abstract Insieme<T> creaInsieme();
^
D:\java\poo\ProveAppelli\Appello17_4_07\InsiemeAst ratto.java:16: type parameter T is not within its bound
public Insieme<T> unione(Insieme<T> i){
^
D:\java\poo\ProveAppelli\Appello17_4_07\InsiemeAst ratto.java:16: type parameter T is not within its bound
public Insieme<T> unione(Insieme<T> i){
^
D:\java\poo\ProveAppelli\Appello17_4_07\InsiemeAst ratto.java:17: type parameter T is not within its bound
Insieme<T> nuovo = creaInsieme();
mi dice che il parametro T è senza il suo limite...se ci aggiungo Comparable mi da però una 15 di errori...
se invece di T scrivo <? super T> mi da questo errore:
D:\java\poo\ProveAppelli\Appello17_4_07\InsiemeAst ratto.java:4: name clash: unione(poo.ProveAppelli.Appello17_4_07.Insieme<? super T>) in poo.ProveAppelli.Appello17_4_07.InsiemeAstratto<T> and unione(poo.ProveAppelli.Appello17_4_07.Insieme<T>) in poo.ProveAppelli.Appello17_4_07.Insieme have the same erasure, yet neither overrides the other
public abstract class InsiemeAstratto<T> implements Insieme{
^
che in verità sarebbe proprio ciò che voglio,fare un overide del metodo dell'interfaccia usando i generici...come risolvo???