2011-01-14 3 views
0

이것이 가능합니까? 확실히 당신이 double을 넘겨 주면 Integer 객체를 캐스트하는 함수 구현 코드는 캐스트 'Integer'가 특별히 사용되지 않으면 작동하지 않습니다. 나는 다음과 같은 기능을 가지고있다 :double에서 정수에 대한 계산을 수행하는 Java 일반 함수?

public static void increment(Object o){ 
    Integer one = (Integer)o; 
    system.out.println(one++); 
} 

나는 이것이 double에 대해 일반적인 방법을 알지 못한다. 시도 :

public static <E> void increment(E obj){ 
    E one = (E)obj; 
    system.out.println(one++); 
} 

하지만 좋지 않았습니까?

+2

어쨌든 '정수'를 증가시킬 수 없습니다. –

+1

당신은 autoboxing/unboxing으로 할 수 있습니다. – biziclop

+0

충분한 [리플렉션] (http://download.oracle.com/javase/6/docs/api/java/lang/reflect/package-summary.html)과 같은 메소드를 작성할 수 있습니다. public static Number increment Number n ')을 반환합니다.이 매개 변수는'n '매개 변수로 전달 된 Number의 동일한 하위 클래스를 반환 할 수 있습니다. 'public static Number add (Number n1, Number n2)'는 실제 리턴 타입을 보장하지 못했습니다. –

답변

0

Double에 다운 캐스트하면 어떻게 될까요?

public static void increment(Object o) { 
    Double d= (Double) o; 
    System.out.println(d + 1.0); 
} 

업데이트

: 나는이 시도하고 일 :

public static void increment(Object o) { 
    Double d = Double.parseDouble(o.toString()); 
    System.out.println(d + 1.0); 
} 
+0

그런 다음 'Integer'가 인수로 전달되면 실패합니다. –

+0

위의 사람이 말했듯이 이것은 데이터를 수정하는 작업에 제네릭 함수를 만들 수는 없으며 데이터 만 표시/정렬 할 수 있습니까? – Jason

+0

글쎄 내 두 번째 코드는 작동하지? 뭔가 돌려 줄까요? Stephen의 코멘트는 첫 번째 스 니펫에 관한 것입니다. –

0

당신은 더 높은 수준의 전문 언어는 크로스 타입의 산술에서 정의한 의미에서 읽을 할 수 있습니다. 내가 권장하는 좋은 예는 JSP EL 사양이다. 그것은 기본적으로 같은 기능을 구현하는 방법을 주문

... 자바에서

http://www.google.com/url?sa=t&source=web&cd=7&ved=0CEwQFjAG&url=http%3A%2F%2Fflaka.googlecode.com%2Ffiles%2Fjsp-2_1-fr-spec-el.pdf&rct=j&q=jsp%20el%20specification&ei=erkwTZrZGJHogQfbxMWiCw&usg=AFQjCNH6oPO7WwgiHCBkST5vgsBxMZmWaQ&sig2=0hRqxe6G0brRGuzNOxEhGw&cad=rja

1

는, 메소드 인자는 값에 의해 전달됩니다. 따라서 메소드 인수를 증가 시키더라도 호출자의 값은 변경되지 않습니다. 그래서, 당신은 새로운 값 반환해야 하나 :

double increment(double x) { 
    return x + 1; 
} 

또는 값이 포함 된 참조 형식 통과 : 자바에서

class MutableDouble { 
    double value; 
} 

void increment(MutableDouble d) { 
    d.value++; 
} 

를 입력 인수 따라서 두 배로, 참조 형식의 유효한되지해야합니다 형식 매개 변수의 값입니다. 당신이 기본 유형을 원하는 경우, 대신 방법 과부하를 고려하십시오

float increment(float f) { 
    return f + 1; 
} 

double increment(double d) { 
    return d + 1; 
} 

당신이 정말로 제네릭을 원하는 경우에

, 당신은 할 수 있습니다 :

@SuppressWarnings("unchecked") 
<N extends Number> N increment(N n) { 
    if (n instanceof Double) { 
     return (N) (Double) (((Double)n) + 1); 
    } else if (n instanceof Float) { 
     return (N) (Float) (((Float)n) + 1); 
    } else if (... 
     // handle remaining cases 
    } else if (n == null) { 
     throw new NullPointerException(); 
    } else { 
     throw new IllegalArgumentException("Unexpected number type: " + n.getClass()); 
    } 
} 

이 비록 추한 godawful입니다. 그런 방법을 정의함으로써 무엇을 성취하려고합니까? 아마도 더 쉬운 방법 일 것입니다 ...

0

모든 원시 값 유형에 대해 작동합니다. 그럼 당신이 할 일은 당신이 증가하고 (불변의 정수 인스턴스를 변경하지) 새 값을 싶어한다고 가정 결과 ;-)

0

를 캐스팅,이 같은 것을 수행 할 수 있습니다

interface Arithmetics<T> { 
    T inc(T val); 
} 

class IntegerArithmetics implements Arithmetics<Integer> { 
    Integer inc(Integer val) { return val+1; } 
} 

//similarly DoubleArithmetics, BigIntegerArithmetics, ... 

을 그리고 당신의 방법을 얻기 위해 호출 :

public static <E> void increment(E obj, Arithmetics<E> arit){ 
    System.out.println(arit.inc(obj)); 
} 

Generic Java Math 라이브러리가 당신을 위해 정확하게는 않습니다.

오직 Arithmetics 개체를 전달해야합니다.이것이 큰 문제인 경우 Map<Class,Arithmetics>을 초기화하고 map.get(obj.getClass())을 사용하여 해당 Arithmetics을 얻을 수 있습니다.

관련 문제