2009-10-24 8 views
1

간단한 유형 (int, float 등)에서 작동 할 수있는 제네릭 클래스를 작성하려고했습니다. 필자는 매개 변수의 유형을 변경하면서 동일한 기능을 여러 번 반복하지 않으려했습니다. 그러나 generic 매개 변수는 참조이므로 C++ 템플릿과 같이 해당 유형의 변수에 대한 계산을 수행 할 수 없습니다.Java generics 및 simple types

제네릭 형식 변수에서 산술 연산자를 사용하는 Java의 간단한 방법이 있습니까? 나는 클래스 검사와 캐스팅을 사용할 수 있다는 것을 알고 있지만 코드가 훨씬 더 많아지고 성능에 영향을 줄 것이라고 생각한다. 그러나 나는 최근에 자바로 작성하기 시작 했으므로 잘못된 것일 수 있습니다.

T foo<T extends Number>(T value) 

value.intValue(), value.longValue(), value.doubleValue()를 사용하여 계산을 수행

답변

-1

자바 1.5 템플릿 방법을 사용할 수 autoboxing

+2

제네릭에 관한 질문이라고 생각합니다. 'T foo (T value)'메소드를 정의하면 어떤 연산도 수행 할 수 없습니다. 오토 박싱은 여기서 도움이되지 않습니다. – tangens

2

하나 개의 솔루션을 통해 당신을 위해이 문제를 처리해야합니다.

+0

하지만 value.someValue() 메서드를 사용하는 방법을 어떻게 알 수 있습니까? 값 자체에 대한 instanceof 점검을 수행합니까? 이는 코드에서 다른 위치로 옮겨지는 똑같은 문제입니다. 반환 할 유형을 결정하는 것과 동일한 어려움. –

+0

누군가 BigDecimal을 전달하면 어떨까요? 그런 다음 그 방법은 완전히 실패합니다. –

3

C++에서 사용하는 방법은 없습니다. 죄송합니다. Java의 제네릭은 C++ 템플릿과 완전히 다르게 작동합니다. Java에서는 일반 코드의 한 버전 만 생성되며 모든 유형 인수에 적합해야합니다. 모든 프리미티브는 바이트 코드에서 다른 표현을 가지므로 동일한 일반 코드를 공유 할 수 없습니다. 이것이 참조 유형 만이 Java의 유효한 유형 인수 인 이유입니다.

가까운 Number 클래스를 사용하는 것이 가장 가까운 것이라고 생각합니다. Autoboxing은 기본 숫자 값을 Number의 서브 클래스로 자동 변환합니다. 예 :

class Foo<T extends Number> { 
    public void operate(T number) { 
    double value = number.doubleValue(); 
    // do something with the double 
    } 
} 
Foo<Integer> intFoo = new Foo<Integer>(); 
intFoo.operate(666); 
intFoo.operate(666.0); // fails to compile 

그러나 매개 변수는 실제로 많이 구매하지 않습니다. operate 메서드가 T 유형의 값을 반환하도록하려면 런타임 검사에 의존해야합니다. 런타임 검사는 용도에 맞지 않습니다.

아마도 흥미로운 쪽지 : Scala 2.8은 기본적으로 컴파일러에게 "형식 인수를 C++ 방식으로 처리"한다고 알리는 주석 @specialize을 지원하며 각기 다른 형식 인수 표현에 대해 다른 버전의 코드를 생성합니다.