C ++ 시절에 C 스타일 캐스트 연산자의 악에 대해 배웠던 나는 처음에는 Java 5 java.lang.Class
에서 cast
메소드를 얻었음 을 알게되어 기뻤습니다 .
드디어 캐스팅에 대한 OO 방식이 있다고 생각했습니다.
결과 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 ++는 상당히 다릅니다.