È possibile sovraccaricare un tipo di campo in un altro tipo di campo?Sovraccarico del tipo di campo dati Java per un altro tipo di campo
Se sì, sarebbe possibile fornire alcuni esempi?
È possibile sovraccaricare un tipo di campo in un altro tipo di campo?Sovraccarico del tipo di campo dati Java per un altro tipo di campo
Se sì, sarebbe possibile fornire alcuni esempi?
È possibile non sovraccarico campi (solo i metodi possono essere sovraccaricati), potrebbe essere confuso con sovrascrivendo campi - che in ogni caso non è possibile, si finisce per nascondere i campi da superclassi. Dai un'occhiata a questo post.
Ho pensato che fosse così e all'inizio sono rimasto un po 'confuso quando sono venuti da me a riguardo. Ho solo programmato Java da tre anni e non mi sono imbattuto in questo. Volevo solo assicurarmi che non mi mancasse nulla. –
@BrandonWilson non è possibile – Pooya
credo che Java supporta le interfacce, e le interfacce dovrebbe essere in grado di aiutarvi a raggiungere ciò che si sta cercando di raggiungere
here's an example i found quick
solo assicurarsi che non si è sovraccarico membri pubblici in quel modo.
un'occhiata a questo codice
class A<T> {
protected T field1;
}
class B extends A<String> {
public char field1;
public static void main(String[] args) {
A a = new B();
a.field1 = 12442;
}
}
viene eseguito senza alcuna eccezione, se campo1 overrided, dovrebbe sollevare un'eccezione, ma non è così
e anche questo viene eseguito senza alcuna eccezione
class A<T> {
protected T field1;
}
class B extends A<Character> {
public char field1;
public static void main(String[] args) {
A a = new B();
a.field1 = 12442;
}
}
E 'impossibile
linguaggio Java (JLS) non lo consente, ma il bytecode Java (JVM) fa
Oracle JDK 1.8.0_45 si basa anche su di esso per implementare assert
. Ad esempio:
public class Assert {
static final int[] $assertionsDisabled = new int[0];
public static void main(String[] args) {
System.out.println(int.length);
assert System.currentTimeMillis() == 0L;
}
}
genera due Oracle JDK 1.8.0_45
, uno esplicito (int[]
) e quello sintetico (bool
), ed è felicemente grado di distinguere tra loro. Ma se avessimo dichiarato:
static final boolean $assertionsDisabled = false;
sarebbe riuscire a compilare con:
the symbol $assertionsDisabled conflicts with a compile synthesized symbo
Vedere https://stackoverflow.com/a/31355548/895245 per maggiori dettagli.
Possibile ragione perché non è possibile
Il problema è che non sarebbe stato possibile determinare il tipo di campo. Considerare:
void f(int i) { System.out.println("int"); }
void f(float i) { System.out.println("float"); }
int i;
float i;
// Which overridden method is called?
void m() { f(i); }
perché non provare provarlo e vedere cosa succede. –