2014-02-23 3 views
2

저는 학교에서 Java를 배우며 주제는 일반적인 방법입니다. 동일한 요소가있는 모든 유형의 배열을 "채우는"제네릭 메서드가있는 응용 프로그램을 작성해야합니다. 나는이 여러 접근 방법을 시도하고 연구 약간의 시간을 보냈다배열 채우기 일반 메서드

package pack.switchshift; 
import java.lang.reflect.Array; 

public class Filler { 

    public static void main(String [] args) { 
     int[] intArr = new int[10]; 
     String[] stringArr = new String[10]; 
     double[] doubleArr = new double[10]; 

     genFill(intArr, 0); 
     genFill(stringArr, "0"); 
     genFill(doubleArr, 0.0); 

     for (int element : intArr){ 
      System.out.print(element); 
     } 
    } 

    private static <T> void genFill(T[] arr, T element) { 
     for (int i = 0; i < arr.length; i++) { 
      arr[i] = element; 
     } 
    } 
} 

, 그러나 나는 아직도 그것을받지 못했습니다 :하지만 작동하지 않습니다 ... 사람이 나에게 도움이 될 수 있습니다. 제네릭은 항상 기본 유형이 작동하지 않습니다

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The method genFill(T[], T) in the type Filler is not applicable for the arguments (int[], int)
The method genFill(T[], T) in the type Filler is not applicable for the arguments (double[], double) at pack.switchshift.Filler.main(Filler.java:11)

+1

기본 유형의 경우 박스형 버전을 사용해야합니다. –

+0

'T'는이 경우 유용하지 않습니다; 당신의 메소드 서명은 단지'private static void genFill (Object [] arr, Object element)이어야합니다. ' – newacct

답변

6

은 (당신이 유형 T의 매개 변수에 원시적 int 유형을 전달할 수 있기 때문에 항상 썼다.하는 intInteger에 자동 박스 것이다). ArrayList<int>을 만들 수 없으며 마찬가지로 int[] 또는 T[] 배열이 필요한 다른 기본 유형 배열을 전달할 수 없습니다. 대신 Integer[]을 전달해야합니다. 마찬가지로 double[] 대신 Double[]을 전달하십시오.

이런 식으로 생각하면 제네릭 메서드는 컴파일러에서 형식 지운 메서드로 컴파일됩니다. 이 과정에서 여기에 유형 매개 변수 T이 지워집니다. 가장 왼쪽의 경계는 Object입니다. 그래서, 컴파일 후 당신의 방법은 동일합니다 : 이제

private static void genFill(Object[] arr, Object element) 

, 당신은 당신이 Object[]이 필요하는 int[]를 전달할 수 없습니다 이해할 수있다.

+0

'원시 타입에 대해서는 제네릭이 항상 작동하지 않습니다. – Kick

+0

@NiksTyagi 글쎄, 당신은 프리미티브 int를 전달할 수 있습니다, '0'매개 변수'T'를 입력하십시오. 'Integer'에 boxed됩니다. –

+0

Thnks rohit ... – Kick

2

Arrays.fill 및 모든 변형을 살펴보십시오.

+0

Arrays.fill은 모든 객체에 대한 일반적인 솔루션을 제공합니다 , 모든 프리미티브 유형에 대한 오버로드 된 버전. 나는 이것이 당신이 원하는 것이라고 생각합니다. – DaoWen

2

기본 요소를 사용하지 마십시오. T 실제로는 어떤 객체가 T 대신에 이 될 것이기 때문에 이것을 할 수 있습니다. 대신 기본 래퍼를 사용해야합니다.

Integer [] intArr = new Integer [10]; 
String [] stringArr = new String[10]; 
Double [] doubleArr = new Double [10]; 
+0

나는 당신이 제안한대로 그것을 편집했고, 지금은 작동한다. .. 희망을 갖고 이것은 또한 실제로 할당에서 요구되는 것이다. –