자바에서 두 배열 (반드시 같은 크기는 아님)을 합친 결과를 반환하는 함수를 작성하고 있습니다.배열을 Java로 합치는 방법
여기 내 시도입니다 :
public static <T> T[] sumArrays(T[] lhs, T[] rhs)
{
T[] out = new T[Math.max(lhs.length, rhs.length)];
for (int i = 0; i < Math.max(lhs.length, rhs.length); ++i){
if (i < Math.min(lhs.length, rhs.length)){
out[i] = lhs[i] + rhs[i];
} else if (i < lhs.length){
out[i] = lhs[i];
} else /* if (i < rhs.length)*/{
out[i] = rhs[i];
}
}
return out;
}
하지만 컴파일 오류에도 불구하고 여러 관측이있다.
극단적으로 거대한 Java 라이브러리에서이 기능이 작동하지 않는 이유는 무엇입니까?
C++에서 템플릿을 사용하는 것처럼 제네릭을 사용하도록 유도되었습니다.
입력 데이터를 자세히 복사하는 것에 대해 걱정이됩니다.
lhs
와``rhs. 아무도 이것에 대해 나를 안심시킬 수 있습니까? C++에서는 상수 참조를 전달할 수 있습니다. 그리고 나는 확실히 알 것이다.T[]
인스턴스화는 제네릭 유형이 잘못되었습니다. 내가 뭘 놓치고 있니?컴파일러가 내
Math.max(lhs.length, rhs.length)
을 반복해서 최적화합니까?컴파일러는
lhs[i] + rhs[i]
을 좋아하지 않습니다. 아마도 T의 유형을 모르기 때문에 C++에서는 유형을 알기 전까지 템플릿을 컴파일하지 않으므로이 작업을 수행 할 수 있습니다.
6) 반환 할 때 깊은 사본을 가져 오겠습니까? 다시 C++ 컴파일러는 추가 복사본을 가져 오지 않습니다.
은 아마도 내가 익숙해 너무 늙었 자바 ;-)
광고 3) http://javadude.com/articles/passbyvalue.htm –
길이가 다른 두 배열의 내용을 추가하는 것은 일반적으로 공통된 사항이 아닙니다. 나는 결코 그것을 해 본 적이 없다. 그런 다음 두 배열을 나누는 방법, 두 배열을 빼는 방법, 한 배열에서 한 배열을 다른 배열로 옮기는 방법 등이 있습니다. Java는 필요할 때 도구를 제공합니다. –
'T'는 런타임에 알 수 없습니다. 그래서 당신은'new T [] '를 할 수 없다. – blank