Когда я учился на C ++ о пороках оператора приведения в стиле C, я сначала был рад обнаружить, что в Java 5 java.lang.Class
есть cast
метод.
Я подумал, что наконец-то у нас появился ОО-подход к кастингу.
Оказывается, Class.cast
это не то же самое, что static_cast
в C ++. Это больше похоже reinterpret_cast
. Он не будет генерировать ошибку компиляции там, где она ожидается, а вместо этого будет отложена до времени выполнения. Вот простой тестовый пример, чтобы продемонстрировать различное поведение.
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 );
}
}
}
Итак, это мои вопросы.
- Должно
Class.cast()
быть сослан в дженерик землю? Там у него довольно много законных применений. - Должны ли компиляторы генерировать ошибки компиляции при
Class.cast()
использовании, а недопустимые условия могут быть определены во время компиляции? - Должна ли Java предоставлять оператор приведения в качестве языковой конструкции, подобной C ++?
Class.cast()
если во время компиляции можно определить недопустимые условия. В этом случае все, кроме вас, используют стандартный оператор приведения. (3) В Java есть оператор приведения в качестве языковой конструкции. Он не похож на C ++. Это потому, что многие языковые конструкции Java не похожи на C ++. Несмотря на внешнее сходство, Java и C ++ совершенно разные.