Podczas moich dni w C ++ uczono mnie o złu operatora rzutowania w stylu C, na początku z przyjemnością odkryłem, że w Javie 5 java.lang.Class
nabyłem cast
metodę.
Pomyślałem, że wreszcie mamy OO sposób radzenia sobie z castingami.
Okazuje się, że Class.cast
to nie to samo, co static_cast
w C ++. To jest bardziej jak reinterpret_cast
. Nie wygeneruje błędu kompilacji tam, gdzie jest oczekiwany, a zamiast tego opóźni działanie. 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 );
}
}
}
Więc to są moje pytania.
- Powinien
Class.cast()
zostać wygnany do ziemi Generics? Tam ma sporo legalnych zastosowań. - Czy kompilatory powinny generować błędy kompilacji, gdy
Class.cast()
są używane i można określić niedozwolone warunki w czasie kompilacji? - Czy Java powinna udostępniać operator rzutowania jako konstrukcję języka podobną do C ++?
Class.cast()
gdy w czasie kompilacji można określić niedozwolone warunki. W takim przypadku wszyscy oprócz Ciebie używają tylko standardowego operatora rzutowania. (3) Java ma operator rzutowania jako konstrukcję językową. Nie jest podobny do C ++. Dzieje się tak, ponieważ wiele konstrukcji języka Java nie jest podobnych do C ++. Pomimo powierzchownych podobieństw, Java i C ++ są zupełnie inne.