Después de haber sido enseñado durante mis días de C++ sobre los males del operador de elenco estilo C, al principio me complació encontrar que en Java 5 java.lang.Class
había adquirido un método cast
.Java Class.cast() frente al operador de elenco
Pensé que finalmente tenemos una forma OO de tratar con el casting.
Resulta 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 y, en su lugar, se pospondrá al 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 desterrar
Class.cast()
a Generics land? Allí tiene bastantes usos legítimos. - ¿Deben los compiladores generar errores de compilación cuando se utiliza
Class.cast()
y se pueden determinar las condiciones ilegales en tiempo de compilación? - ¿Debería Java proporcionar un operador de conversión como una construcción de lenguaje similar a C++?
Respuesta simple: (1) ¿Dónde está "Generics land"? ¿En qué se diferencia esto de cómo se usa el operador de reparto ahora? (2) Probablemente. Pero en el 99% de todo el código Java que se haya escrito, es * extremadamente * improbable que alguien use 'Class.cast()' cuando las condiciones ilegales se pueden determinar en tiempo de compilación. En ese caso, todos menos Uds. Usan el operador de conversión estándar. (3) Java tiene un operador de conversión como una construcción de lenguaje. No es similar a C++. Eso se debe a que muchas de las construcciones de lenguaje de Java no son similares a C++. A pesar de las similitudes superficiales, Java y C++ son bastante diferentes. –
Por qué -1 --------- –