2015-01-30 5 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

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

누군가가 어리석은 이유가 없다. –

+0

자바에서 객체가 실제로 '바이트'인지 또는 '긴'인지 구분할 수 있습니까? 리플렉션과 같은 것이 있습니까? – ryanyuyu

+0

@ryanyuyu'byte'와'long's는 객체가 아닙니다. – Qix

답변

11

나는 이것을 할 타당한 이유가 없다고 생각합니다. 개체가 변경 가능하고 이러한 개체의 복사본을 만들려는 경우에는 의미가 있습니다. 그러나 원시 래퍼 클래스는 변경 불가능하므로 기존 객체를 사용하여 생성자를 호출하는 것은 의미가 없습니다.

0

instanceof를 원래의 코드가 명확하게 숫자의 다른 종류를 구별하기위한 것입니다 때문에 경우에 왜 물어 보지. 방금 "Number"를 반환하면 obj는 Number에 캐스팅되어 실제로 Number가 아닌 경우에도 ClassCastException이 발생합니다. 원래 코드를 사용하여 사용자는 obj를 적절한 유형으로 다소 안전하게 캐스팅 할 수 있습니다.

+0

숫자는 숫자 데이터 유형의 수퍼 클래스입니다. – ryanyuyu

+0

예, 매개 변수로 obj를 사용합니다. 고양이를 가면 무엇을 돌려 줄까요? – Aify

+2

'(obj instanceof Number)'체크 – ryanyuyu

2

저자가 일반화 된 복사 기능을 만들려고했다고 생각합니다. 작동 방식은 hes가이 개체가 숫자 인 경우 새 개체를 만들고 새 인스턴스에 숫자를 반환하는 것과 같습니다. 예 :

바이트 (바이트 값) 지정된 바이트 값을 나타내는 새로 할당 된 Byte 개체를 생성합니다.

아마, 그것은 이해하는 경우, 그는 많은 데이터가있을 수 있습니다 및 숫자 인 경우 또는 작동하지 않는 동안 알 수 없습니다. 따라서 그는 숫자로만 작업하기를 원하거나 숫자가 아닌 경우 예외를 피하고 공통 단위를 사용하려고합니다. 나는이 사건을 진행하는 방법이라고 말하지는 않겠지 만, (C++ 프로그램이 코드를 작성한 것처럼 들리는 설명이 아닌) 이해할 수 있습니다. BTW, 다른 답변에 나타났습니다, 개체가 불변하므로 실제 예제가 있다면, 거기에 대한 좋은 이유가 없습니다.

그것은 여러 가지 이유로 이해되지 않는다
1

:

  1. 원시 유형이 "새로운"생성자를 통해 갈 이유가 없다, 불변 그것은 함수가 반환 이후 다른 클래스를 구분하기 위해 이해되지 않는다
  2. 마지막 숫자
  3. 새 인스턴스를 차별화하고 생성하는 것이 필요하다하더라도 generic 메서드 http://docs.oracle.com/javase/tutorial/java/generics/methods.html을 작성하는 것이 좋습니다 (코드가 제네릭을 지원하지 않는 일부 이전 버전의 Java로 작성된 경우 제외). 너무 많은 코드를 복제 (컴파일 - 체크

생각할 수있는 유일한 이유는 목록에 모든 유형의 숫자가 포함되어 있지 않고 프로그래머가 지원되는 숫자 유형을 화이트리스트에 표시하려고하지만, 이 방법은 아프다.

관련 문제