PDA

Visualizza la versione completa : Problemi generici...


valerik87
16-12-2007, 03:03
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...:

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);

devo concretizzare gli ultimi 4 metodi dell'interfaccia.

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:



public Insieme<T> unione(Insieme<T> i){
Insieme<T> nuovo = creaInsieme();
return nuovo;
}

il metodo praticamente nn fa nessuna operazione in realtà vorrei prima vedere se scrivo bene il codice ed infatti mi da un errore:

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???

valerik87
16-12-2007, 03:10
scusate invece di metterlo nella sezione java l'ho scritto quì...potete cancellarlo che lo riapro nella giusta sezione,perdonatemi ma sono pure le 3 della notte e ancora studio ^^

alka
16-12-2007, 23:41
Originariamente inviato da valerik87
scusate invece di metterlo nella sezione java l'ho scritto quì...potete cancellarlo che lo riapro nella giusta sezione,perdonatemi ma sono pure le 3 della notte e ancora studio ^^
In genere, le discussioni si spostano se si trovano in una sezione errata, non si duplicano.
Passo e chiudo. :fagiano:

Loading