Java Class.cast () vs. operator rzutowania

Będąc nauczanym podczas moich dni C ++ na temat zła operatora rzutowania w stylu C, z początku byłem zadowolony, że znalazłem to w Javie 5java.lang.Class nabyłcast metoda.

Pomyślałem, że w końcu mamy OO sposób radzenia sobie z castingiem.

Okazało sięClass.cast nie jest taki sam jakstatic_cast w C ++. To bardziejreinterpret_cast. Nie wygeneruje błędu kompilacji w miejscu, w którym jest oczekiwany i zamiast tego będzie odraczał czas wykonywania. Oto prosty przypadek testowy pokazujący różne zachowania.

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 );
        }
    }
}

To są moje pytania.

PowinienClass.cast() zostać wygnany do ziemi Generics? Tam ma całkiem sporo legalnych zastosowań.Kompilatory powinny generować błędy kompilacjiClass.cast() jest używane i nielegalne warunki mogą być określone w czasie kompilacji?Czy Java powinna udostępniać operatora rzutowania jako konstrukcję języka podobną do C ++?

questionAnswers(7)

yourAnswerToTheQuestion