2012-07-02 33 views
5

Các mã sau đặt ra một "không đánh dấu/chưa được xác nhận dàn diễn viên" vi phạm nghiêm trọng sử dụng Sonar + FindBugs:không đánh dấu/chưa được xác nhận dàn diễn viên sử dụng Generics nhiều giới hạn

1 public static <P extends ComponentContainer & AlignmentHandler> void addComponentAligned(P parent, Component child, Alignment alignment) { 
2  parent.addComponent(child); 
3  parent.setComponentAlignment(child, alignment); 
4 } 

Bất kỳ ý tưởng về làm thế nào tôi nên tránh vi phạm này?

EDIT: Vi phạm là trên dòng 3

EDIT: Phương pháp chữ ký theo: ComponentContainer # addComponent (Component) AlignmentHandler # setComponentAlignment (Component, Alignment)

+0

Chờ đã, có thực sự là một cách để sử dụng nhiều thừa kế trong Java thông qua những gì bạn đang cố gắng không? – BlackVegetable

+1

Chưa hoàn tất. Câu nào cụ thể gây ra lỗi? Cũng hiển thị các định nghĩa của 'addComponent()' và 'setComponentAligment()'. Chúng tôi không phải là độc giả. –

+0

@BlackVegetable: Nhiều giao diện thừa kế, có. –

Trả lời

5

Không có dàn diễn viên trong mã nguồn của bạn, nhưng trong bytecode kết quả từ biên dịch có. Trong bytecode, các kiểu generic được xóa. Việc tẩy xoá cho P là giới hạn đầu tiên, ComponentContainer. Vì vậy, các bytecode là (hầu như) tương đương với bytecode này:

public static void addComponentAligned(ComponentContainer parent, Component child, Alignment alignment) { 
    parent.addComponent(child); 
    ((AlignmentHandler)parent).setComponentAlignment(child, alignment); 
} 

FindBugs nhìn bytecode đó, và kết luận rằng rằng dàn diễn viên để AlignmentHandler có thể thất bại, bởi vì (như xa như FindBugs thấy) phương pháp chấp nhận bất kỳ ComponentContainer .

Đây là lỗi tìm lỗi; bạn nên mở một báo cáo lỗi. Nó trông giống như một cái gì đó có thể được sửa mà không cần phân tích mã nguồn. Bytecode cũng chứa các loại thực (chung), và findbugs nên sử dụng nó.

Các vấn đề liên quan