Ben Java 5 bulmak için ilk başta memnun etti C tarzı döküm operatörü kötülükleri hakkında benim C ++ gün boyunca öğretilen olması java.lang.Class
bir edinmişti cast
yöntemi.
Sonunda oyuncu kadrosuyla başa çıkmak için bir OO yöntemimiz olduğunu düşündüm.
C ++ 'daki ile Class.cast
aynı olmadığı ortaya çıktı static_cast
. Daha çok benziyor reinterpret_cast
. Beklendiği yerde bir derleme hatası oluşturmayacak ve bunun yerine çalışma zamanını erteleyecektir. İşte farklı davranışları göstermek için basit bir test durumu.
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 );
}
}
}
İşte sorularım bunlar.
- Meli
Class.cast()
Jenerik arazi sürülecek? Orada epeyce meşru kullanımları vardır. - Derleyiciler
Class.cast()
kullanıldığında derleme hataları üretmeli mi ve derleme sırasında yasadışı koşullar belirlenebilir mi? - Java, C ++ 'ya benzer bir dil yapısı olarak bir döküm operatörü sağlamalı mı?
Class.cast()
. Bu durumda, siz hariç herkes standart döküm operatörünü kullanır. (3) Java'nın dil yapısı olarak bir çevirme operatörü vardır. C ++ 'ya benzemez. Bunun nedeni, Java'nın dil yapılarının çoğunun C ++ 'ya benzememesidir. Yüzeysel benzerliklere rağmen, Java ve C ++ oldukça farklıdır.