Dopo essere stato istruito durante i miei giorni C++ sui malvagi dell'operatore di cast in stile C, sono stato contento di scoprire che in Java 5 java.lang.Class
era stato acquisito un metodo cast
.Java Class.cast() rispetto all'operatore di cast
Ho pensato che finalmente abbiamo un modo OO di gestire il casting.
Risulta Class.cast
non corrisponde a static_cast
in C++. È più simile a reinterpret_cast
. Non genererà un errore di compilazione laddove è previsto e verrà invece rimandato al runtime. Ecco un semplice caso di test per dimostrare diversi comportamenti.
package test;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
public class TestCast
{
static final class Foo
{
}
static class Bar
{
}
static final class BarSubclass
extends Bar
{
}
@Test
public void test ()
{
final Foo foo = new Foo();
final Bar bar = new Bar();
final BarSubclass bar_subclass = new BarSubclass();
{
final Bar bar_ref = bar;
}
{
// Compilation error
final Bar bar_ref = foo;
}
{
// Compilation error
final Bar bar_ref = (Bar) foo;
}
try
{
// !!! Compiles fine, runtime exception
Bar.class.cast(foo);
}
catch (final ClassCastException ex)
{
assertTrue(true);
}
{
final Bar bar_ref = bar_subclass;
}
try
{
// Compiles fine, runtime exception, equivalent of C++ dynamic_cast
final BarSubclass bar_subclass_ref = (BarSubclass) bar;
}
catch (final ClassCastException ex)
{
assertTrue(true);
}
}
}
Quindi, queste sono le mie domande.
- Il
Class.cast()
dovrebbe essere esiliato in terra generica? Lì ha alcuni usi legittimi. - I compilatori generano errori di compilazione quando viene utilizzato
Class.cast()
e possono essere determinate condizioni non valide al momento della compilazione? - Java dovrebbe fornire un operatore di cast come un costrutto di linguaggio simile al C++?
Risposta semplice: (1) Dove si trova "Terra generica"? In che modo è diverso da come viene utilizzato l'operatore di cast adesso? (2) Probabilmente. Ma nel 99% di tutto il codice Java mai scritto, è * estremamente * improbabile che qualcuno usi 'Class.cast() 'quando è possibile determinare condizioni illegali in fase di compilazione. In tal caso, tutti, tranne voi, usano semplicemente l'operatore di cast standard. (3) Java ha un operatore di cast come costrutto linguistico. Non è simile a C++. Questo perché molti dei costrutti del linguaggio Java non sono simili a C++. Nonostante le somiglianze superficiali, Java e C++ sono piuttosto diversi. –
Perché -1 --------- –