Java Class.cast () vs. operador de elenco

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, no Java 5java.lang.Class tinha adquirido umcast método.

Eu pensei que finalmente temos uma maneira OO de lidar com o elenco.

AconteceClass.cast não é o mesmo questatic_cast em C ++. É mais comoreinterpret_cast. Ele 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 comportamentos diferentes.

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, estas são minhas perguntas.

DevemosClass.cast() ser banido para a terra dos genéricos? Lá tem alguns usos legítimos.Os compiladores devem gerar erros de compilação quandoClass.cast() é usado e condições ilegais podem ser determinadas em tempo de compilação?O Java deve fornecer um operador de conversão como uma construção de linguagem semelhante ao C ++?

questionAnswers(7)

yourAnswerToTheQuestion