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.Classavait acquis une castméthode.
Je pensais que finalement nous avions une façon OO de gérer le casting.
Il s'avère que ce Class.castn'est pas la même chose qu'en static_castC ++. 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.