Đượ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 castphươ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.castkhông giống như static_casttrong 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.