Essendo stato insegnato durante i miei giorni in C ++ sui mali dell'operatore cast in stile C, all'inizio fui contento di scoprire che in Java 5 java.lang.Class
avevo acquisito un cast
metodo.
Ho pensato che finalmente abbiamo un modo OO di affrontare il casting.
Si scopre che Class.cast
non è la stessa static_cast
di C ++. È più simile reinterpret_cast
. Non genererà un errore di compilazione dove previsto e rimanderà invece al runtime. Ecco un semplice test case per dimostrare comportamenti diversi.
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.
- Dovrebbe
Class.cast()
essere bandito nella terra dei Generics? Lì ha diversi usi legittimi. - I compilatori dovrebbero generare errori di compilazione quando
Class.cast()
vengono utilizzati e le condizioni illegali possono essere determinate in fase di compilazione? - Java dovrebbe fornire un operatore cast come costrutto di linguaggio simile a C ++?
Class.cast()
quando le condizioni illegali possono essere determinate in fase di compilazione. In tal caso, tutti tranne te usano solo l'operatore cast standard. (3) Java ha un operatore cast come costrutto del linguaggio. 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 abbastanza diversi.