확장 된 컬렉션을 매개 변수화하려면 어떻게해야합니까?
-
21-08-2019 - |
문제
나는 많은 성공을 거두지 않고 Arraylist 클래스를 확장하려고 노력했습니다. 확장하고 매개 변수화 할 수 있습니다.
그래서 일반적으로 당신은 같은 것을 가지고 있습니다
ArrayList<SomeObject> list = new ArrayList<SomeObject>();
원해요
MyList<SomeObject> list = new MyList<SomeObject>();
ArrayList를 확장하는 것은 작동하지 않습니다.
public class MyList extends ArrayList ...
내가 그것을 사용하려고 할 때 나는 오류를 얻는다
유형 마이리스트는 일반적이지 않습니다. 인수로 매개 변수화 될 수 없습니다u003CSomeObject>
나는 변형을 시도했다
public class MyList extends ArrayList<Object>
public class MyList<SubObject> extends ArrayList<Object>
성공하지 못한 상태에서 클래스 이름 뒤에 서브 버젝트를 사용하면 작동하는 것처럼 보이지만 어떤 이유로 든 하위 목체 클래스의 방법을 숨 깁니다.
이 일을 올바르게하는 방법에 대한 모든 생각이나 제안에 감사드립니다.
해결책
당신은 다음에 유형을 지정해야합니다 ArrayList
의 유형 매개 변수. 일반 유형 매개 변수의 경우 T
상당히 일반적입니다. 컴파일러는 무엇을 알지 못하기 때문에 T
, 당신은 유형 매개 변수를 추가해야합니다. MyList
그것은 유형을 통과시킬 수 있습니다. 따라서, 당신은 다음을 얻을 수 있습니다.
public class MyList<T> extends ArrayList<T>
또한 구현을 고려할 수 있습니다 List
그리고 위임 ArrayList
, 상속하기보다는 ArrayList
. "클래스 상속에 대한 대상 구성을 선호합니다. [디자인 패턴 pg. 20] ""
다른 팁
public class MyList<T>
extends ArrayList<T>
{
}
MyList<SomeObject> list = new MyList<SomeObject>();
또는
public class MyList
extends ArrayList<SomeObject>
{
}
MyList list = new MyList();
ArrayList를 확장해서는 안됩니다 AbstractList 대신에:
public class MyList<T> extends AbstractList<T> {
public int size() {...}
public T get(int index) {...}
}
제휴하지 않습니다 StackOverflow