2011-11-01 7 views
5

Ho seguito classe con un metodo statico:statico <T estende numero e confrontabile <? Super Numero >>

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; 
    } 

} 

provo a chiamare questo metodo:

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

Netbeans compilatore mi mostra questo messaggio di errore:

metodo inRange nella classe Helper non può essere applicato a determinati tipi; richiesto: T, T, T trovato: java.lang.Integer, java.lang.Integer, java.lang.Integer motivo: il tipo inferito non è conforme ai limiti dichiarati inferito: java.lang.Integer legato (i): java.lang.Number, java.lang.Comparable

Qualche idea?

grazie.

risposta

10

Prova <T extends Number & Comparable<T>>.

E.g. Integer implementa Comparable<Integer>, che non è compatibile con Comparable<? super Number> (Numero intero non è una superclasse di Numero). Comparable<? extends Number> non funzionerebbe perché Java potrebbe pensare che ? potrebbe essere una qualsiasi sottoclasse di Number e passare uno T a non verrà quindi compilato perché prevede un parametro di ?, non T.

Edit: come detto newacct, <T extends Number & Comparable<? super T>> funzionerà anche (ed essere leggermente più generale) da allora compareTo sarà quindi accettare qualsiasi ? cui T è una sottoclasse, e come al solito, un'istanza di una sottoclasse può essere dato come parametro in cui è prevista una superclasse.

+0

grazie mille, funziona :) e anche grazie per la spiegazione! – misco

+1

per risultati ottimali, usare '>' – newacct

Problemi correlati