Давайте предположим, что у вас есть какой-то метод вроде:
public <T extends Number> T max (T a, T b) {
...
//return maximum of a and b
}
Если вы знаете, что в качестве параметров могут быть переданы только целые числа, длинные и двойные, то вы можете изменить сигнатуру метода на:
public <T extends Number> T max(double a, double b) {
return (T)Math.max (a, b);
}
Это будет работать для байтов, коротких, целых, длинных и двойных.
Если вы предполагаете, что BigInteger или BigDecimal или смесь чисел с плавающей и двойной точностью могут быть переданы, то вы не можете создать один общий метод для сравнения всех этих типов параметров.