Après avoir enseigné pendant mon C++ jours sur les maux de la C-style opérateur de cast, j'ai été heureux d'abord de trouver que dans Java 5 java.lang.Class
avaient acquis une cast
méthode.
J'ai pensé que nous avons enfin un OO façon de traiter avec la coulée.
S'avère Class.cast
n'est pas le même que static_cast
en C++. C'est plus comme reinterpret_cast
. Il ne générera pas d'erreur de compilation où il est prévu et au lieu de s'en remettent à l'exécution. Voici un test simple de cas pour illustrer les différents comportements.
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 );
}
}
}
Donc, voici mes questions.
- Devrait -
Class.cast()
être banni à des Génériques de terre? Là, il a fait quelques utilisations légitimes. - Devrait compilateurs génèrent des erreurs de compilation lors de l'
Class.cast()
est utilisé et les conditions de travail illégales peuvent être déterminés au moment de la compilation? - Devrait Java fournir un opérateur de cast comme une construction du langage similaire à C++?