Ayant appris pendant mes jours C ++ sur les maux de l'opérateur de cast de style C, j'ai d'abord été heureux de constater que Java 5 java.lang.Class
avait acquis une cast
méthode.
Je pensais que finalement nous avions une façon OO de gérer le casting.
Il s'avère que ce Class.cast
n'est pas la même chose qu'en static_cast
C ++. C'est plus comme reinterpret_cast
. Il ne générera pas une erreur de compilation là où elle est attendue et se reportera à l'exécution. Voici un cas de test simple pour démontrer 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 );
}
}
}
Alors, ce sont mes questions.
- Devrait
Class.cast()
être banni sur le territoire des génériques? Là, il a plusieurs utilisations légitimes. - Les compilateurs doivent-ils générer des erreurs de compilation quand
Class.cast()
est utilisé et que des conditions illégales peuvent être déterminées au moment de la compilation? - Java devrait-il fournir un opérateur de cast comme une construction de langage similaire à C ++?
Class.cast()
lorsque des conditions illégales peuvent être déterminées au moment de la compilation. Dans ce cas, tout le monde sauf vous utilise simplement l'opérateur de distribution standard. (3) Java a un opérateur de cast comme construction de langage. Ce n'est pas similaire au C ++. En effet, de nombreuses constructions de langage Java ne sont pas similaires à C ++. Malgré les similitudes superficielles, Java et C ++ sont assez différents.