Paolinos ha scritto:
public void inter(Ins<Integer> k) {
Iterator<Integer> myIterator = new MyIter();
while(myIterator.hasNext()) {
int temp=myIterator.next(); //temp = il prossimo indice con true
if(!k.contains(temp))
arr[temp]=false;
}
}
public boolean contiene(int x) {
if(x >= arr.length)
return false;
return(arr[x]);
}
Molto meglio. Se proprio vogliamo fare i fini si dovrebbe anche controllare che x sia >= 0.
Paolinos ha scritto:
Nell'interfaccia Ins:
void inter(Ins<T> k);
E siccome tu hai "fissato" la parametrizzazione quando hai fatto
BoolSet implements Ins<Integer> in sostanza vuol dire che la signature di cui fare l'override è appunto
void inter(Ins<Integer>)
Paolinos ha scritto:
Ho implementato anche il metodo clona() (clona l'insieme) in questo modo:
public BooleanSet clona() {
try {
return (BooleanSet) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
No, non è sufficiente!
Il tuo BoolSet estende implicitamente Object. Il clone() di Object si limita SOLO a copiare i valori dei campi pari pari dall'oggetto corrente a quello nuovo "clonato".
Se un campo è primitivo, no prob. Se è un campo
reference ad un oggetto "immutabile" (es. Integer, String), no prob. perché se anche il vecchio e il clonato condividono lo stesso riferimento, essendo l'oggetto immutabile non causa alcun problema.
Ma il tuo boolean[] è mutabile! Quindi il BoolSet vecchio e il BoolSet clonato hanno il riferimento allo STESSO array e la modifica su un BoolSet si ripercuote e si "vede" anche dall'altro e viceversa.
In pratica così hai solo fatto una "shallow" copy e non una "deep" copy. In questi casi devi fare qualcosa tu esplicitamente, ovvero CLONARE l'array (sì, gli array hanno il clone() e tra l'altro da Java 5 sfrutta il tipo di ritorno "covariante").
Ultima considerazione: usare super.clone() non è sbagliato. In questo caso è meno importante/necessario. Serve sicuramente quando sei in una gerarchia più complessa e hai svariate classi "al di sopra" (e magari NON sotto il tuo controllo). In questo caso è importante chiamare il clone "di sopra" così da fare la cosa giusta, qualunque cosa faccia. Ma nel tuo caso SAI che estendi direttamente Object.
Ah: clon
e() ... non clona()
P.S. Ahhh se avessi una conoscenza solida e cristallina di Java come ce l'ho io ....