C++ 時代に C スタイルのキャスト演算子の弊害について教わった私は、最初は Java 5 でメソッドが追加されたことを知ってうれしく思いましjava.lang.Class
たcast
。
最終的に、キャストをオブジェクト指向の方法で処理できるようになったと思いました。
結局のところ、C++Class.cast
と同じではありません。static_cast
それはもっと似てい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++ と同様の言語構造としてキャスト演算子を提供する必要がありますか?