2015-06-03 4 views
2

Может быть, я просто узел в моих синапсах ...Autoboxing 0 до Generic Номера

public static <T extends Number> T firstNonZero(T... values) { 
    for (T value : values) { 
     if (value.doubleValue() != 0.0) { 
     return value; 
     } 
    } 
    return (T) 0;  // Cannot cast from int to T 
    } 

я думаю мне не нужно объяснять выше метод. Моя проблема в том, что мне нужно «сгенерировать» нуль типа T.

Как это сделать?

+0

возвращение нуль вместо – Shail016

+0

возврата Integer.class.cast (0) –

+2

Если не метод называется 'firstNonZero' действительно верните 'null' вместо этого, если не может быть найдено ненулевое значение вместо нуля или даже вызвать исключение? –

ответ

5

Ну, как:

public static <T extends Number> T firstNonZero(T... values) { 
    T zero = null; 
    for (T value : values) { 
     if (value.doubleValue() != 0.0) { 
     return value; 
     } else { 
     zero = value; 
     } 
    } 
    return zero; 
    } 

Это предполагает, что по крайней мере одно значение передается методу.

0

Как об этом:

public static <T extends Number> T firstNonZero(T... values) { 
     for (T value : values) { 
      if (value.doubleValue() != 0.0) { 
      return value; 
      } 
     } 
     return (T)Integer.class.cast(0);  // Double class can do too but give 0.0 if double or we will have ClassCastException 
     } 

Также 0 номер параметра будет работать в этом случае

+1

Я не думаю, что это сработает. Попробуйте это с помощью 'double d = firstNonZero (0.0);' И если вы измените его на 'Double.class.cast', попробуйте с' int d = firstNonZero (0); ' –

+0

@tobias_k no это не сработает для double d = firstNonZero (0.0); как я только что пробовал и о вашем втором запросе о Double.class.cast Я обновил ответы на ответ. «Двойной класс тоже может сделать, но дать 0.0, если double« –

+1

не удается: 'assertEquals (new Long (0), NumberUtilities.firstNonZero (0L)); ' – sjngm

Смежные вопросы