Được dạy trong những ngày học C ++ của tôi về các tệ nạn của toán tử ép kiểu C, ban đầu tôi rất vui khi thấy rằng trong Java 5 java.lang.Class
đã có được một cast
phương thức.
Tôi nghĩ rằng cuối cùng thì chúng ta cũng có một cách xử lý tốt cho việc tuyển chọn.
Hóa ra Class.cast
không giống như static_cast
trong C ++. Nó giống hơn reinterpret_cast
. Nó sẽ không tạo ra lỗi biên dịch mà nó được mong đợi và thay vào đó sẽ trì hoãn thời gian chạy. Đây là một trường hợp thử nghiệm đơn giản để chứng minh các hành vi khác nhau.
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 );
}
}
}
Vì vậy, đây là những câu hỏi của tôi.
- Có nên
Class.cast()
bị trục xuất đến vùng đất Generics? Ở đó nó có khá nhiều cách sử dụng hợp pháp. - Trình biên dịch có nên tạo ra lỗi biên dịch khi
Class.cast()
được sử dụng và các điều kiện bất hợp pháp có thể được xác định tại thời điểm biên dịch không? - Java có nên cung cấp toán tử ép kiểu như một cấu trúc ngôn ngữ tương tự như C ++ không?
Class.cast()
khi các điều kiện bất hợp pháp có thể được xác định tại thời điểm biên dịch. Trong trường hợp đó, tất cả mọi người, trừ bạn chỉ sử dụng toán tử truyền chuẩn. (3) Java có một toán tử ép kiểu như một cấu trúc ngôn ngữ. Nó không tương tự như C ++. Đó là vì nhiều cấu trúc ngôn ngữ của Java không giống với C ++. Mặc dù có những điểm tương đồng bề ngoài, Java và C ++ khá khác nhau.