2010-03-08 15 views
6

Kiểm tra bytecode, tôi đã nhận thấy javac có vẻ trùng lặp với các hướng dẫn checkcast khi truyền tới các loại mảng.Tại sao mảng kiểm tra javac hai lần?

Cast.java: 
class Cast { 
    void test(Object a) { 
    Object[] b = (Object[])b; 
    } 
} 

javap tháo của phiên bản javac biên soạn

void test(java.lang.Object); 
    Code: 
    0: aload_1 
    1: checkcast #2; //class "[Ljava/lang/Object;" 
    4: checkcast #2; //class "[Ljava/lang/Object;" 
    7: astore_2 
    8: return 

Testing Jikes thể hiện single cast dự kiến ​​

void test(java.lang.Object); 
    Code: 
    0: aload_1 
    1: checkcast #10; //class "[Ljava/lang/Object;" 
    4: astore_2 
    5: return 

checkcast là nghĩa vụ để nâng cao một ngoại lệ nếu đối tượng không thể được điều trị như loại được yêu cầu và nếu không thì không có gì, vì vậy tôi không thấy lý do tại sao nó có thể giúp tăng gấp đôi dàn diễn viên. Tôi đã không xem xét các nguồn JDK để xem nó được tạo ra như thế nào, và nếu điều đó giúp giải thích lý do tại sao (có thể nó có nghĩa là gợi ý).

+1

Thú vị ... Thảo luận ở nơi khác: http://mail-archive.ow2.org/asm/2007-07/msg00034.html – polygenelubricants

Trả lời

8

Đây là known bug của javac. Nhưng nó hầu như vô hại.

+0

Cảm ơn bạn đã tham khảo. Tìm kiếm của tôi không thành công. – Brandon

+0

Bạn sẽ nghĩ rằng nó sẽ được sửa chữa, làm thế nào cứng nó có thể được sửa chữa! –