2011-11-01 30 views
5

Tôi đã sau lớp học với một phương pháp tĩnh:static <T mở rộng Số & So sánh <? siêu Số >>

public class Helper { 

    public static <T extends Number & Comparable<? super Number>> Boolean inRange(T value, T minRange, T maxRange) { 
     // equivalent (value >= minRange && value <= maxRange) 
     if (value.compareTo(minRange) >= 0 && value.compareTo(maxRange) <= 0) 
      return true; 
     else 
      return false; 
    } 

} 

tôi cố gắng gọi phương pháp này:

Integer value = 2; 
Integer min = 3; 
Integer max = 8; 
Helper.inRange(value, min, max) ; 

Netbeans trình biên dịch cho tôi thông báo lỗi này:

Phương thức inRange trong lớp Trình trợ giúp không thể áp dụng cho các kiểu đã cho; Yêu cầu : T, T, T được tìm thấy: java.lang.Integer, java.lang.Integer, java.lang.Integer lý do: loại suy ra không tuân theo (các) ràng buộc được khai báo suy luận: java.lang.Integer (các) liên kết: java.lang.Number, java.lang.Comparable

Bất kỳ ý tưởng nào?

cảm ơn.

Trả lời

10

Hãy thử <T extends Number & Comparable<T>>.

Ví dụ: Integer thực hiện Comparable<Integer>, không tương thích với Comparable<? super Number> (Số nguyên không phải là siêu lớp của Số). Comparable<? extends Number> sẽ không hoạt động vì Java sau đó sẽ nghĩ rằng ? có thể là bất kỳ lớp con nào của Number và chuyển một số T đến compareTo sau đó sẽ không biên dịch vì nó dự kiến ​​tham số ?, chứ không phải T.

Edit: như newacct nói, <T extends Number & Comparable<? super T>> sẽ làm việc quá (và hơi tổng quát hơn) kể từ đó compareTo sau đó sẽ chấp nhận bất kỳ ? trong đó T là một lớp con, và như thường lệ, một thể hiện của một lớp con có thể được trao như một tham số trong đó một siêu lớp được mong đợi.

+0

cảm ơn bạn rất nhiều, nó hoạt động :) và cũng nhờ lời giải thích! – misco

+1

để có kết quả tốt nhất, sử dụng '>' – newacct

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