Ho chiesto informazioni su Interpretazione del compilatore di overrideing e overloading su StackOverflow , e ho ottenuto buone risposte, ma questo mi ha portato ad un'altra domanda che non sono sicuro sia appropriato per SO, ma penso sia per questo.
Si dovrebbe leggere la domanda originale e risposta accettata , ma forse è comprensibile osservando il seguente codice:
public static void whatIs(Circle s)
{
System.out.println("Circle");
}
public static void whatIs(Square s)
{
System.out.println("Square");
}
e tentiamo di chiamare,
whatIs(shapes[0]); //array of Shape objects (interface implemented by Circle,Square)
whatIs(shapes[1]);
otterremo due errori (uno per Square
e uno per Circle
) che indicano che:
- method Driver.whatIs(Square) is not applicable
- actual argument Shape cannot be converted to Square by method invocation conversion
Come suggerito nella mia domanda, l'utilizzo di instanceof
può dare i risultati desiderati e come suggerito dalla risposta:
The compiler could auto generate code like
if (shapes[0] instanceof Circle) { whatIs((Circle) shapes[0]); //prints "Circle" }
ma, non . Per essere chiari, so che si può usare una classe astratta invece di un'interfaccia per ottenere funzionalità simili, tuttavia nessuno sa perché il compilatore Java non lo farà automaticamente per te? Non sono un tipo da compilatore, ma ho la sensazione che questa non sia una domanda basata sull'opinione pubblica. Presumo che ci sia una buona ragione per questa decisione.