2015-07-07 10 views

risposta

12

Dal javadoc direttamente:

Non possiamo dichiarare campi statici cui tipi sono tipo parametri

campo statico di una classe è una variabile a livello di classe condiviso da tutti gli oggetti non statici della classe. Quindi, i campi statici dei parametri di tipo non sono consentiti. Si consideri la seguente classe:

public class MobileDevice<T> { 
    private static T os; 

    // ... 
} 

Se sono stati autorizzati campi statici di parametri di tipo, quindi il seguente codice sarebbe confusa:

MobileDevice<Smartphone> phone = new MobileDevice<>(); 
MobileDevice<Pager> pager = new MobileDevice<>(); 
MobileDevice<TabletPC> pc = new MobileDevice<>(); 

perché il sistema operativo campo statico è condivisa dal telefono, cercapersone, e pc , qual è il vero tipo di sistema operativo? Allo stesso tempo, non può essere Smartphone, cercapersone e TabletPC. Non è possibile, quindi, creare campi statici di parametri tipo.

+0

Grazie per la tua risposta dettagliata! – Frank

+0

bellissimo esempio –

2

Il solostatic la cosa che può contenere i parametri di tipo è il metodo static, che deve definire i propri parametri di tipo. Qualcosa di simile:

static <T> void staticGenericMethod(T param) { .. } 

Nel tuo caso, il tipo di parametro ha un ambito di classe, è esempio legato e non ha nulla a che fare con le static membri della classe.

Quindi, si dovrebbe sia rimuovere le static parole chiave per ZERO e INFINITYo introdurre static metodi che restituiscono ZERO e INFINITY. Ad esempio:

public interface TimeInterface<T> { 
    static <X> X getZero() { 
     //implementation 
    } 
    static <X> X getInfinity() { 

    } 
} 

noti che le X tipo-parametri sono valide solo per il metodo statico corrispondenti e non sono condivisi tra la classe.

Il problema, tuttavia, con questo approccio è che non c'è modo per garantire che l'istanza tipo di parametro (T) è lo stesso tipo di parametro del metodo statico (X), che può causare gravi problemi quando usato in modo errato.

Si noti inoltre che i metodi static sono consentiti nelle interfacce in Java8, quindi se si sta utilizzando una versione di ordine Java, è necessario convertire lo TimeInterface in una classe.

+0

Grazie per la tua risposta dettagliata! – Frank

+0

Prego. –

Problemi correlati