Habiendo aprendido durante mis días en C ++ sobre los males del operador de conversión de estilo C, al principio me complació descubrir que en Java 5 java.lang.Class
había adquirido un cast
método.
Pensé que finalmente tenemos una forma OO de lidiar con el casting.
Resulta que Class.cast
no es lo mismo que static_cast
en C ++. Es más como reinterpret_cast
. No generará un error de compilación donde se espera, sino que se aplazará hasta el tiempo de ejecución. Aquí hay un caso de prueba simple para demostrar diferentes comportamientos.
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 );
}
}
}
Entonces, estas son mis preguntas.
- ¿Debería
Class.cast()
ser desterrado a tierras genéricas? Allí tiene bastantes usos legítimos. - ¿Deberían los compiladores generar errores de compilación cuando
Class.cast()
se utiliza y se pueden determinar condiciones ilegales en el momento de la compilación? - ¿Debería Java proporcionar un operador de conversión como una construcción de lenguaje similar a C ++?
Class.cast()
cuando se pueden determinar condiciones ilegales en tiempo de compilación. En ese caso, todos, excepto usted, solo usan el operador de conversión estándar. (3) Java tiene un operador de conversión como construcción de lenguaje. No es similar a C ++. Esto se debe a que muchas de las construcciones del lenguaje Java no son similares a C ++. A pesar de las similitudes superficiales, Java y C ++ son bastante diferentes.