2010-08-03 3 views
2

그래서 두 가지 방법이 있습니다. 하나는 두 개의 int를 추가하고 다른 하나는 두 개의 long을 추가하는 것입니다. 매개 변수가 함수로 전달되는 곳입니다.Java에서 형식이 지정되지 않은/일반화 된 매개 변수를 만드는 방법은 무엇입니까?

매개 변수를 일반화하고이를 수행하기 위해 값을 반환하는 방법을 하나 만들 수 있습니까?

+0

자바에서는 서로 다른 인수와 이름을 가진 두 가지 메소드를 사용할 수 있습니다. 이 상황에서 당신은 객체와 제네릭을 사용하지 않고도 원시 타입을 사용하여 수행 할 수 있기 때문에이 방법이 가장 바람직하다고 생각합니다 (Java와 관련이 없으며 일반 개념과 관련이없는 대학 숙제가 아닌 경우). –

+0

숙제가 아니라 단지 내가 가진 질문입니다. – Brandon

+1

Brandon : 이런 종류의 요구 사항은 실제 상황에서는 거의 목적이 없습니다. 우리가 왜이 일을하려고하는지 묻는다면? – StriplingWarrior

답변

3

불행하게도, 당신이 할 수 있다고 생각하지 않습니다. 먼저 Java generics can't be parameterized over primitives이므로 intlong 대신 IntegerLong을 사용해야합니다. 둘째, generic 형식 매개 변수 T extends Number이있는 메서드를 사용할 수는 있지만 임의의 두 가지 Number 하위 클래스를 일반 방식으로 추가 할 수는 없습니다. 즉, 다음 코드 것이다 하지 일 :

public static <T extends Number> T add(T a, T b) { 
    return a + b; // Won't compile, as the addition is not legal Java code. 
} 
+0

왜 downvote? 내가 틀렸을 때, 이것을 할 수있는 방법이 있다면, 나는 정말로 어떻게 알고 싶습니다. – bcat

+0

당신이 그 말을했을 때 왜 내가 downvoted에 대한 내 의견을 쓰고 있었다. 어쨌든 ... 첫 번째 문장은 오해의 소지가 있습니다. Primitive에 래퍼 클래스를 사용하는 것은 쉽습니다. 후자의 점은 아마도 Brandon의 기존 메서드가 두 개의 int와 두 개의 long을 추가하기위한 것이기 때문에 일반적인 메서드는 동일한 기능을 가지기를 원하기 때문에 필요하지는 않습니다. int와 long을 추가하십시오. – JAB

+0

예. 2 개의 int와 2 개의 long을 추가하는 경우에만. – Brandon

0
long f(long x, long y){ ... } 

int x=1, y=2; 
f(x,y); 
+0

'int z = f (x, y)'는'f '의 반환 값을'int '로 변환하지 않고 컴파일하지 않기 때문에 OP가 원하는 것과 정확히 일치하지는 않습니다. – bcat

5

나는 GWT이 같은 속임수 보았다

public static <T> T add(long a, long b) 
{ 
    return (T)(Object)(a + b); 
} 

이처럼 사용

long answer = add(1L, 2L); 
int answer2 = add(1, 2); 

이것이 당신이 요구하는 동안,이 접근법의 단점은 나쁜 타입 캐스트까지 당신을 열어 준다는 것입니다. 반환 된 값을 명시 적으로 캐스팅 할 필요는 없지만 실제로 예상되는 형식이 무엇이든 캐스트를 수행하도록 코드에 지시하는 것입니다. 실수로 다음과 같이 말할 수 있습니다.

String t = add(1, 2); 

이는 런타임 예외가 발생할 수 있습니다. 그럼에도 불구하고 반환 값이 반환 된 후 즉시 반환되는 메서드가있는 경우이 트릭을 사용하면 명시 적으로 값을 캐스팅하는 번거 로움을 줄일 수 있습니다.

+0

흠 ... 이걸 실행할 때 변수를 Integer 및 Long로 선언해야합니다. 프리미티브를 사용하면 컴파일이 실패합니다. 그리고 실패한 정수에 대한 런타임 예외가 발생했습니다 <-> Long cast. – JAB

+0

흥미 롭습니다. 필자는 컴파일과 실행을 실제로 시도하지는 않았지만 이클립스는 불만을 표시하지 않으므로 적어도 컴파일 할 것이라고 생각했습니다. – StriplingWarrior