Tendo aprendido durante meus dias de C ++ sobre os males do operador de elenco de estilo C, fiquei satisfeito em primeiro lugar ao descobrir que em Java 5 java.lang.Class
havia adquirido um cast
método.
Achei que finalmente tínhamos uma maneira OO de lidar com o elenco.
Acontece que Class.cast
não é o mesmo que static_cast
em C ++. É mais parecido reinterpret_cast
. Não irá gerar um erro de compilação onde é esperado e, em vez disso, irá adiar para o tempo de execução. Aqui está um caso de teste simples para demonstrar diferentes comportamentos.
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 );
}
}
}
Então, essas são minhas perguntas.
- Deve
Class.cast()
ser banido para terras de Genéricos? Lá, ele tem alguns usos legítimos. - Os compiladores devem gerar erros de compilação quando
Class.cast()
são usados e condições ilegais podem ser determinadas em tempo de compilação? - O Java deve fornecer um operador de elenco como uma construção de linguagem semelhante ao C ++?
Class.cast()
quando condições ilegais podem ser determinadas em tempo de compilação. Nesse caso, todos, exceto você, apenas usam o operador de elenco padrão. (3) Java tem um operador cast como uma construção de linguagem. Não é semelhante ao C ++. Isso ocorre porque muitas das construções da linguagem Java não são semelhantes a C ++. Apesar das semelhanças superficiais, Java e C ++ são bastante diferentes.