2015-01-30 4 views
0

Зачем кому-то это делать?Зачем кому-то это делать?

private Number genericObjectToNumber (Object obj) 
{ 
    if (obj instanceof Byte) 
    { 
     return(new Byte((Byte) obj)); 
    } 
    else if (obj instanceof Short) 
    { 
     return(new Short ((Short) obj)); 
    } 

.....

else if(obj instanceof BigInteger) 
    { 
     return(BigInteger.ZERO.add ((BigInteger) obj)); 
    } 
    return(null); // if it isn't a number, we don't want it 
} 

Почему бы не только вернуть актеров? Зачем проходить через конструктор нового объекта? Почему бы не спросить, если OBJ InstanceOf

if (obj instanceof Number) 
    { 
     return((Number)obj); 
    } 
+3

Нет веской причины, кто-то был просто глупым. –

+0

Как в java вы бы различали, действительно ли объект был 'byte' или действительно' long'? Есть что-то вроде Reflection? – ryanyuyu

+0

@ryanyuyu 'byte' и 'long' не являются объектами. – Qix

ответ

11

Я думаю, что нет веских причин для этого. Это может иметь смысл, если объекты изменяются, и вы хотите создать копии этих объектов. Но примитивные классы-оболочки неизменны, поэтому вызов конструкторов, использующих существующие объекты, не имеет смысла.

0

Поскольку исходный код явно имел в виду различие между разными видами чисел. Если вы только что вернули «Number», то obj будет отправлен в число (даже если это не было фактически число), что может привести к исключению ClassCastException. Используя исходный код, пользователь может несколько безопасно применить объект к соответствующему типу.

+0

Число является суперклассом для числовых типов данных. – ryanyuyu

+0

Да, но он принимает любой объект в качестве параметра; если вы перейдете в кошку, что она вернется? – Aify

+2

Ошибка 'if (obj instanceof Number)' check – ryanyuyu

2

Я думаю, автор пытался создать обобщенную функцию копирования. Как работает, так как hes пытается создать новый объект, если этот объект является числом, возвращая число в новом экземпляре; например:

Байт (байт) Создает только что выделенный объект байта, который представляет указанное значение байта.

Возможно, если это имеет смысл, у него может быть много данных и он не знает, есть ли число или нет во время работы. поэтому он хочет работать только с числами или хочет использовать общий блок после и избегать исключений, если не числа. Я не говорю об этом, чтобы идти по этим делам, но это может иметь смысл (поскольку объяснение не рекомендация, похоже, что программа на C++ написала код). Кстати, как замечено в других ответах, объекты неизменяемы, поэтому, если это реальный пример, для этого нет веской причины.

1

Это не имеет смысла по нескольким причинам:

  1. Примитивные типы неизменны, нет никаких причин, чтобы пройти через «новый» конструктор
  2. Это не имеет смысла дифференцировать различные классы, поскольку функция возвращает a Число в конце
  3. Даже если необходимо было дифференцировать и создать новый экземпляр, было бы, вероятно, лучше написать общий метод http://docs.oracle.com/javase/tutorial/java/generics/methods.html (если код не был написан в какой-то старой версии Java, которая не поддерживала дженерики), то реплицируя так много кода (хотя он будет компилировать-проверить для чисел, которые могут быть нежелательными)

Единственная правдоподобная причина, по которой я мог думать, состоит в том, что список не содержит всех типов чисел, и программист хочет, чтобы белые списки поддерживали типы чисел, но даже тогда, метод плохо назван

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