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 ++と同様の言語構造としてキャスト演算子を提供する必要がありますか?
Class.cast()
の不正な条件がコンパイル時に決定されることができるとき。その場合、あなた以外の全員が標準のキャスト演算子を使用します。(3)Javaには、言語構成要素としてキャスト演算子があります。C ++とは異なります。これは、Javaの言語構造の多くがC ++に似ていないためです。表面的な類似性にもかかわらず、JavaとC ++はまったく異なります。