2014-06-06 5 views
0

도와주세요. 이것은 숙제 임무이며, 나는 그것이 작동하지 않는 이유를 알 수 없다. 선형 검색 메서드를 호출 할 때 올바른 데이터 형식 인 T를 전달하지 않는다고 말합니다. T는 일반 데이터 형식이어야하므로 왜 힘든 시간을 보내고 있는지 이해할 수 없습니다. 도와주세요!제네릭 데이터 유형을 사용하는 것이 좋습니다

public static void main(String[] args) { 
     int[] five= new int[5]; 
     int[] ten= new int[10]; 
     int[] fifteen= new int[15]; 
     fillArray(five); 
     fillArray(ten); 
     fillArray(fifteen); 

     int result1 = linearSearch(five, 37); 
     int result2 = linearSearch(ten, 37); 
     int result3 = linearSearch(fifteen, 37); 

     System.out.println(Arrays.toString(five) + " " + result1); 
     System.out.println(Arrays.toString(ten) + " " + result2); 
     System.out.println(Arrays.toString(fifteen) + " " + result3); 

    } 

//이 메서드는 채워진 배열에 대해 선형 검색을 수행하며 모든 데이터 형식을 받아 들여야합니다.

public static <T extends Comparable<T>> int linearSearch(T[] array, T data){ 
     int value = -1; 
      for(int i=0; i<array.length; i++){ 
      if (array[i]== data){ 
       value = i; 
       } 
      } 
      return value; 
     } 
+9

원시는 원시 유형에서 작동하지 않습니다. –

+1

'int [] '대신'Integer []'를 사용해보십시오 – Bohemian

답변

3

, 그래서 같이 제네릭은 원시 형 작동하지 않습니다. 실제 개체 만 사용할 수 있습니다. 그리고 안타깝게도이 시나리오에서는 오토 복싱이 마술처럼 작동하지 않습니다.

래퍼 객체 Integer을 사용하여 제네릭을 계속 사용할 수 있습니다 (예 : fillArray 메서드가 Integer 객체와 함께 작동한다고 가정하면 예제에 게시되지 않습니다). 당신은 형식적인 이론의 일부에 관심이 있다면, 예를 들어,

public static void main(String[] args) { 
    Integer[] five = new Integer[5]; 
    Integer[] ten = new Integer[10]; 
    Integer[] fifteen = new Integer[15]; 

    fillArray(five); 
    fillArray(ten); 
    fillArray(fifteen); 

    int result1 = linearSearch(five, 37); 
    int result2 = linearSearch(ten, 37); 
    int result3 = linearSearch(fifteen, 37); 

    System.out.println(Arrays.toString(five) + " " + result1); 
    System.out.println(Arrays.toString(ten) + " " + result2); 
    System.out.println(Arrays.toString(fifteen) + " " + result3); 

} 

, 당신은 JLS 4.5 - Parameterized Types 입력 매개 변수에 대한 자세한 내용을보실 수 있습니다. 4.5.1에서 볼 수 있듯이 다음과 같이 표시됩니다.

유형 인수는 참조 유형 또는 와일드 카드 일 수 있습니다.

... 암시 적으로 기본 유형을 제외합니다. 실제로 JLS에서 명시 적으로 금지하고있는 부분을 찾을 수는 없지만 거기에 있음을 확신합니다.

+1

언 박싱은 없습니다. linearSearch의 반환 유형은'T'가 아니라'int'입니다 (그러나 나는 당신이했던 것과 같은 방법으로 잘못 읽었습니다). – aRestless

+0

@a 무서운 오, 맞아. 더러. 나는'>을 바보처럼 보았다. Haha – asteri

+0

믿거 나 말거나, 그냥 테스트했고, 타입이 T 인 것을 반환하면 반환 값이 원시 타입에 할당되면 컴파일러 오류가 발생하지 않습니다. – asteri

1

제네릭에서는 할 수 없지만 reflection으로 할 수 있습니다!

public static int linearSearch(Object array, 
    Object data) { 
    int len = Array.getLength(array); 

    for (int i = 0; i < len; i++) { 
    if (Array.get(array, i).equals(data)) { 
     return i; 
    } 
    } 
    return -1; 
} 

public static void main(String[] args) { 
    int[] five = new int[] { 1, 2, 37 }; 
    int[] ten = new int[] { 1, 37, 5 }; 
    float[] fifteen = new float[] { 1.0f, 2.2f, 0f, 4f }; 

    int result1 = linearSearch(five, 37); 
    int result2 = linearSearch(ten, 37); 
    int result3 = linearSearch(fifteen, 37); 

    System.out.println(Arrays.toString(five) + " " 
     + result1); 
    System.out.println(Arrays.toString(ten) + " " 
     + result2); 
    System.out.println(Arrays.toString(fifteen) + " " 
     + result3); 
} 

그리고 출력은,

[1, 2, 37] 2 
[1, 37, 5] 1 
[1.0, 2.2, 0.0, 4.0] -1 
+0

아마도 밀도가 높을 것입니다.하지만 이것이 반사와 관련이 있다는 것을 알지 못합니까? 그래도 멋진 자동 권투 솔루션. – asteri

+2

재해 발생 대기 ... –

+0

@JeffGohlke'java.lang.reflect.Array' –

관련 문제