2011-01-09 5 views
0

int에 하나, String에 하나, 다른 유형의 사용자 정의 오브젝트에 대해 하나씩 3 개의 링크 된 목록을 만들어야한다고 가정 해보십시오. 제네릭을 사용했다면 하나의 링크 된 목록을 작성하는 것만으로도 쉽게 할 수 있지만 제네릭을 사용하지 않는 경우 동일한 반복 코드를 3 번 ​​쓰는 것을 피할 수있는 방법이 있습니까?제네릭없이 코드 재사용

답변

2

int 대신 Integer을 사용하는 경우 그렇습니다. 이 경우 세 객체는 모두 Object의 하위 클래스이므로 Linked List 클래스는 Object을 처리 할 수 ​​있습니다.

코드는 대략처럼 보일 것이다

class MyLinkedList{ 
    public void add(Object){...} 
    public Object remove(Object){...} 
    ... 
} 
0

ints vs Strings에 대해 동일한 코드를 사용할 수는 없지만 Integers를 의미한다고 가정하면 java.lang.Objects를 저장하는 LinkedList를 만들어야합니다. 그런데 일반적인 LinkedLists의 기본 기능은 다음과 같습니다. .

0

연결된 목록이 처리하는 형식을 자신의 형식 (예 : StringOrIntOrCustom)으로 추상화하고 각 형식 중 하나를 사용할 수 있으며 유효한 플래그를 지정할 수있는 플래그를 사용할 수 있습니다. 그러나이 데이터 형식을 사용할 때마다 형식이 지원하지 않는 작업을 수행하지 않도록 많은 검사를 수행해야합니다.

1

Java 1.5에서 제네릭을 소개하기 전에 컬렉션은 모두 Object 유형을 사용 했으므로 객체의 연결 목록을 사용하게됩니다. 그런 다음 올바른 유형을 추가, 검색 및 캐스팅했는지 확인해야합니다.

Java 1.4를 사용하는 것이 더 이상 필요하지 않거나 더 이상 권장되지 않기 때문에 제네릭을 사용하지 않아야하는 이유가 표시되지 않습니다.

+0

아, 맞습니다. 나는 제네릭을 사용할 수 없습니다. 왜냐하면 그것이 제가 작업중인 과제의 제한 사항 중 하나이기 때문입니다. – elemental009

+1

Java의 모든 클래스가 객체 baseclass를 확장한다는 점을 제외하고는 매우 최신 할당과 같지 않습니다. – Daff

0

당신은 밖으로 제네릭 함께 할 수 있지만, 당신은 더 컴파일 시간 유형 안전 검사를하지 않을 것이다 당신이 수동으로 모든 유형의 캐스팅을 추가해야합니다.

그러나 제네릭을 사용할 때 컴파일러가 수행하는 작업을 다시 수행하게됩니다. 이제는 오류가 발생하기 쉽고 수동 일뿐입니다.

0

예, 그렇게 할 수 있으며 그리 어렵지 않습니다.

abstract class ListNode { 
    public ListNode next_; 
}; 

interface ListNodeFactory { 
    public ListNode createListNode(); 
} 

그런 다음 조작하는 개체를 ListNode List 클래스를 만들 수 있습니다. 필요한 경우 새로운 ListNode를 작성하기 위해 호출하는 함수가 있습니다. add 메서드는 ListNodeFactory 인수를 취합니다. 대부분의 메소드가 protected 일 것이라고 제안합니다. 파생 클래스가 아닌 클라이언트가 그것을 사용하지 않기 때문입니다.

각 유형에 대해 List에서 파생 클래스를 만듭니다. 원하는 메서드를 사용하는 메서드로 각 메서드를 래핑해야합니다. 적절한 유형의 새 목록 노드를 만드는 ListNodeFactory 구현을 만들어야합니다. 또한 데이터를 얻기 위해 트래버스 또는 제거에서 적절한 유형으로 나가는 객체를 캐스팅해야합니다 (ListNode). 다음은 예입니다.

class IntListNode extends ListNode { 
    public int data_; 
    public IntListNode(int x) { 
     data_ = x; 
    } 
} 

class IntListNodeFactory implements ListNodeFactory { 
    IntListNodeFactory() { 
     nextdataset_ = false; 
    } 
    IntListNodeFactory(int x) { 
     nextdataset_ = true; 
     data_ = x; 
    } 
    void setNextData(int x) { 
     nextdataset_ = true; 
     nextdata_ = x; 
    } 
    public ListNode createListNode() { 
     if (!nextdataset_) { 
      throw Exception("Tried to create a node with no data!"); 
     } else { 
      ListNode result = new IntListNode(data_); 
      nextdataset_ = false; 
      return result; 
     } 
    } 
} 
관련 문제