2013-06-05 2 views
5

Vorrei chiedere informazioni sulle classi generiche. Cosa succede quando creo due istanze di oggetti da una classe generica. Condividono tutti i membri statici o entrambi hanno i propri membri statici?Le classi generiche condividono membri statici?

Così, per esempio:

public A<?>(){ 
    public static Integer member = 0; 
} 

A<Integer> integer = new A<Integer>(); 
A<String> string = new A<String>(); 

fare sia Integer e String avere lo stesso riferimento dietro member?

+2

La tua domanda è valida, ma il codice che hai postato è sbagliato: non è né un costruttore valido, né una dichiarazione di classe. La risposta alla tua domanda è: Sì, condividono tutti i membri statici. Inoltre, puoi rispondere tu stesso alla domanda: 'System.out.println (integer.member == string.member);' Che è uguale a 'System.out.println (A.member == A.member);' perché è 'statico') – jlordo

+0

Non è difficile testare ... – Dukeling

+0

Cosa succede se il membro stesso è generico? Come 'classe pubblica MyClass {membro statico pubblico T; } '?? –

risposta

10
public class A<T>{ 
    public static Integer member = 0; 

    public static void main(String[] args) 
    { 
     A<Integer> integer = new A<Integer>(); 
     A<String> string = new A<String>(); 

     integer.member++; 
     System.out.println(string.member); 
    } 
} 

uscita

1 

Quindi, sì le due istanze condividono la stessa variabile member.

+2

+1 Bel esempio per la domanda. Degno di nota anche il fatto che 'integer.member ++;' è uno stile dannoso, e stylecheckers scoraggia il codice come questo. I membri 'static' dovrebbero sempre essere accessibili in modo statico, ad es .:' A.member ++; '. – jlordo

+0

Quando sei nel dubbio provalo! :) +1 – Pragmateek

0

Sì, condividono la variabile. Le regole sulle variabili di classe statiche non cambiano in base all'utilizzo di Generics. Una variabile di classe statica è condivisa da tutte le istanze.

+1

Questo non dovrebbe essere dato per scontato. In C++ 'A ' e 'A ' sarebbero classi diverse con membri di dati statici distinti. –

+0

@NicolaMusatti: questa è una domanda sotto il tag 'java' .... – jlordo

+0

Infatti. Eppure Java Generics è stato ispirato dai modelli C++ e penso che sia importante sottolineare le differenze. –

0

Tutti condividono i loro attributi statici perché in fase di esecuzione A<Integer> e A<String> non sono classi distinte.

0

Devi solo pensare che i generici sono a scopo di compilazione. In fase di runtime, non vi è alcuna differenza tra A<Integer> e A<String>: sono tutte le istanze di A. Quindi i membri statici sono comuni a tutte le istanze che puoi creare, senza riguardo al tipo che stai utilizzando.

3

Buona domanda ma l'anwser è: no, non è possibile per un motivo molto semplice: una volta lì compilato è alcuna cosa come un < Integer> o A < String>, solo A perché per retrocompatibilità motivi Java utilizza tipo generico-cancellazione.

In altre lingue come C# le cose funzionerebbero come ci si aspetta perché C# è stato creato dall'inizio con generici.

+0

Grazie per aver menzionato C#. L'originale del mio pensiero proveniva da un esempio in C#. – Quirin

+0

Mi trovo in una situazione simile: è difficile tornare indietro di 10 anni quando utilizzo Java, ma sono sicuro che colmerà il divario. :) – Pragmateek

2

Non esiste alcuna classe letterale (A<Integer>.class o Class istanza) che rappresenta qualsiasi tipo di parametro (ad esempio A<Integer>). Ce ne sarà sempre uno solo per la versione raw A (ad esempio A.class), ed è quello con cui appartengono tutti i membri statici.

Ecco perché non si farà qualcosa come A<Integer>.member, dovrebbe sempre essere la versione originale A.member (e questo è l'unico (e unico) condiviso da tutte le istanze).

È possibile leggere un articolo sull'argomento qui - Is there one instances of a static field per instantiation of a generic type?.