Originariamente inviato da Cecca
Salve a tutti

Il mio problema è in linea di massima piuttosto semplice...ho:

public class SynchPort <T>

contente un metodo send e receive. Tramite questa classe un thread mittente invia (send) un messaggio sincronizzandosi col destinatario (receive) (più o meno problema produttori/consumatori).

Il tipo generico T mi crea dei problemi nella receive...
nella send passo l'oggetto per riferimento (ovviamente) e lo assegno alla variabile locale della classe SynchPort

public void send(Thread Threadref, T info){


Main.Mutex.P(Threadref);
this.mittente = Threadref.getName();
this.data = info;
Main.SemCond.V();

}

Lasciate perdere mutex e semcond che sono 'primitive di sincronizzazione' da me implementate a scopo didattico.

e fin qui tutto bene...l'oggetto viene passato e puntato da 'data'.

public void receive(T RecMess , Thread Threadref){

Main.SemCond.P(Threadref);
ProcessoRicevente.mittente = this.mittente;
RecMess = this.data;
Main.Mutex.V();

}

qui la cosa non funziona più (giustamente) perché RecMess è una copia del puntatore passato...
a prescindere dalla bruttezza della soluzione anche per il campo mittente...una cosa analoga per il tipo generico T non andrebbe ovviamente bene...inoltre NON posso usare return dovendo usufruire per motivi di progetto delle funzioni P e V...
come faccio a restituire al thread ricevente il generico oggetto? o in questo caso...a far puntare una sua variabile locale al contenuto di this.data?
Se non puoi usare il valore di ritorno del metodo devi modificare il parametro che ti viene passato, ma per fare questo il tipo del parametro dev'essere "predisposto", per esempio con un metodo accessibile al codice che stai scrivendo.
Se io per assurdo passassi ad un metodo un oggetto che ha solo campi e metodi provati, il metodo puo' provarci finche' vuole ma non modifichera' mai il mio oggetto.

Il metodo, come dici, riceve una copia del reference, di conseguenza non puo' modificare il reference originale (a parte ovviamente il caso in cui possa accedervi) ma puo' modificare solo l'oggetto a cui i reference puntano, e solo se quest'oggetto lo permette.

Quindi se la sua variabile locale ha un modificatore d'accesso sufficientemente permissivo, modificala semplicemente e falla riferire alla tua variabile locale.

(tutto questo ovviamente parlando di oggetti e non tipi primitivi)

Spero d'aver capito il problema, metti il codice fra tag [CODE] per renderlo piu' leggibile.