2014-02-09 3 views
3

잘못된 배열을 제한하지 않고 배열 기반 목록을 구현했습니다. 캐스트 (MyList<String> myList = new MyList<String>())를 사용하여 만들면 다른 모든 인수 (int, float, double 등)도 허용합니다. 데이터 유형이 지정되어있는 경우이를 수용 할 수있는 방법은 무엇일까? 데이터 유형이 지정되지 않은 경우에는 지금 그대로 작동하도록합니다.목록 구현이 캐스트를 해석하지 않습니다.

public class MyList <T> implements MyListInterface 
{ 

    private Object[] contents; 
    private int size; 

    public MyList() 
    { 
     this(10); 
    } 

    public MyList(int length) 
    { 
     contents = new Object[length]; 
     size = 0; 
    } 

    private void alterArraySize(int value) 
    { 
     int len = 0; 

     //Value is 1 shrink array; value is 2 then double it 
     switch (value) 
     { 
      case 1: 
       len = contents.length/2; 
       break; 
      case 2: 
       len = contents.length * 2; 
       break; 
     } 

     Object[] copyArr = new Object[len]; 

     //Copy array 
     for (int i = 0; i < size; i++) 
     { 
      copyArr[i] = contents[i]; 
     } 

     contents = copyArr; 
    } 

    public <T> boolean insertHead(T newEntry) 
    { 

     size++; 

     if ((size + 1) == contents.length) 
      alterArraySize(2); 

     //Shift elements up one 
     for (int i = size; i >= 0; i--) 
      contents[i + 1] = contents[i]; 

     contents[0] = newEntry; 

     return true; 
    } 


    public <T> boolean insertTail(T newEntry) 
    { 
     //If the number of items in the list 
     if ((size + 1) == contents.length) 
      alterArraySize(2); 

     //Put the newEntry in the last slot in the array 
     contents[size++] = newEntry; 

     return true; 
    } 

    public <T> Object deleteHead() 
    { 
     //Set temp to first item in the array 
     Object temp = contents[0]; 

     //Delete the first item 
     contents[0] = null; 

     //Shift all items in the list down one position 
     for (int i = 1; i < size; i++) 
     { 
      contents[i - 1] = contents[i]; 
     } 

     //Update size to accommodate for the item deletion 
     size--; 
     return temp; 
    } 


    public <T> Object deleteTail() 
    { 
     //Set temp to last item in array 
     Object temp = contents[--size]; 

     //Delete the last item 
     contents[size] = null; 

     //Resize if the number of items in the list is half the length 
     if (size <= contents.length/2) 
      alterArraySize(1); 

     return temp; 
    } 


    public void display() 
    { 
     for (int i = 0; i < size; i++) 
      System.out.println(contents[i]); 
    } 


    public <T> int contains(T anEntry) 
    { 
     for (int i = 0; i < size; i++) 
     { 
      if (contents[i].equals(anEntry)) 
       return ++i; 
     } 

     return 0; 
    } 


    public boolean isEmpty() 
    { 
     return size == 0; 
    } 


    public boolean isFull() 
    { 
     //List can't be full 
     return size == contents.length; 
    } 

    public <T> Object get(int givenPosition) 
    { 
     if ((givenPosition >= 1) && (givenPosition <= size)) 
      return contents[givenPosition - 1]; 

     return null; 
    } 

    public <T> void set(T s, int givenPosition) 
    { 
     contents[givenPosition - 1] = s; 
    } 

    public <T> Object remove(int givenPosition) 
    { 
     Object temp = null; 

     //Check if givenPosition is valid and shift elements after remove 
     if ((givenPosition >= 1) && (givenPosition <= size)) 
     { 
      temp = contents[givenPosition - 1]; 
      for (int i = givenPosition; i < size; i++) 
      { 
       contents[i - 1] = contents[i]; 
      } 

      contents[size--] = null; 
     } 

     return temp; 
    } 

    public int size() 
    { 
     return size; 
    } 

} 

답변

7

당신의 모든 방법은 일반적인 스스로 있습니다

여기 내 코드입니다. 그래서, 그들은 자신의 타입 파라미터를 가지고 있습니다. 그것들은 당신의 클래스로 선언 된 타입 파라미터와 아무 관련이 없습니다. 아래의 방법 선언은 제네릭 :이 방법은 모든 인수 형식을 적용하고이 방법에 대한 T을 입력합니다 매개 변수 당신이 무엇을 만들 클래스의 인스턴스를 그래서

public <T> boolean insertHead(T newEntry) 

, 그 유형으로 추정됩니다. 문제를 해결하려면 모든 방법에서 <T> 부분을 제거해야합니다. 에 방법은 위의 예를 들어 변경 :

public boolean insertHead(T newEntry) 

는 또한, 당신의 방법은 발신자 끝에서 실패 대신 다른 ObjectT의 반환 형식을 가져야한다.

public <T> Object get(int givenPosition) 
{ 
    if ((givenPosition >= 1) && (givenPosition <= size)) 
     return contents[givenPosition - 1]; 

    return null; 
} 

에 :

public T get(int givenPosition) 
{ 
    if ((givenPosition >= 1) && (givenPosition <= size)) 
     return (T) contents[givenPosition - 1]; // Add cast 

    return null; 
} 
+0

감사합니다 방법을 변경! 이것은 내 문제를 해결했다. 이것은 클래스가 클래스 정의 이후에 제네릭을 받아들이는 것을 의미합니까? 그리고 모든 클래스는 type 객체로부터 상속을 받기 때문에 클래스 정의에 이 있기 때문에 클래스가 캐스트로 전달되는 클래스로 변환됩니다. – Whoppa

+0

@Whoppa 당신은 무엇을 의미합니까 - "모든 클래스는 타입 객체로부터 상속받습니다 *. 예 클래스는 클래스 이름 뒤에 ''이 있기 때문에 일반 클래스입니다 –

+0

모든 클래스가 type 객체에서 파생되었다고 생각하고있었습니다. String과 같이 Type 객체를 상속받습니다. Node가 Node 객체에서 상속받습니다. 내 생각이 잘못 되었습니까? – Whoppa

관련 문제