Java 메서드가 모든 유형의 일반 목록을 반환하는 방법은 무엇입니까?
나는 java.util.List
모든 유형의 캐스트 할 필요 없이 유형을 반환하는 방법을 작성하고 싶습니다 .
List<User> users = magicalListGetter(User.class);
List<Vehicle> vehicles = magicalListGetter(Vehicle.class);
List<String> strings = magicalListGetter(String.class);
메소드 서명은 어떻게 생겼습니까? 아마도 (?) :
public List<<?> ?> magicalListGetter(Class<?> clazz) {
List<?> list = doMagicalVooDooHere();
return list;
}
미리 감사드립니다!
private Object actuallyT;
public <T> List<T> magicalListGetter(Class<T> klazz) {
List<T> list = new ArrayList<>();
list.add(klazz.cast(actuallyT));
try {
list.add(klazz.getConstructor().newInstance()); // If default constructor
} ...
return list;
}
메소드에 일반 유형 매개 변수도 제공 할 수 있습니다. 사물을 만들기 위해 올바른 클래스 인스턴스가 필요 합니다. 추론했습니다 ( klazz.getConstructor().newInstance()
).
수업을 통과 할 필요도 없습니다.
public <T> List<T> magicalListGetter() {
return new ArrayList<T>();
}
또 다른 옵션은 다음을 수행하는 것입니다.
public class UserList extends List<User>{
}
public <T> T magicalListGetter(Class<T> clazz) {
List<?> list = doMagicalVooDooHere();
return (T)list;
}
List<User> users = magicalListGetter(UserList.class);
`
우리가 List<Object> objectList
캐스팅하고 싶은 것을 갖자List<T>
public <T> List<T> list(Class<T> c, List<Object> objectList){
List<T> list = new ArrayList<>();
for (Object o : objectList){
T t = c.cast(o);
list.add(t);
}
return list;
}
이전 방식을 사용할 수 있습니다.
public List magicalListGetter() {
List list = doMagicalVooDooHere();
return list;
}
또는 Object
모든 항목의 부모 클래스를 사용할 수 있습니다 .
public List<Object> magicalListGetter() {
List<Object> list = doMagicalVooDooHere();
return list;
}
참고 목록에 넣을 모든 개체에 대해 더 나은 부모 클래스가있을 수 있습니다. 예를 들어, Number
당신은 넣을 수 있습니다 것입니다 Double
과 Integer
거기에.
이 같은
publiс <T> List<T> magicalListGetter(Class<T> clazz) {
List list = doMagicalVooDooHere();
return list;
}
List로 캐스팅 한 다음 모든 요소를 T로 캐스팅 할 수 있는지 확인할 수 있습니다.
public <T> List<T> asList(final Class<T> clazz) {
List<T> values = (List<T>) this.value;
values.forEach(clazz::cast);
return values;
}
나는 당신이 경고를 생성 할 <stuff>를 완전히 삭제할 수 있다고 확신하고, @ 억제 경고를 사용할 수 있습니다. 정말로 제네릭을 원하지만 요소를 사용하려면 유형 캐스팅을 수행해야합니다. 예를 들어, 간단한 거품 정렬 함수를 만들었고 목록을 정렬 할 때 제네릭 유형을 사용합니다.이 경우 실제로는 Comparable 배열입니다. 항목을 사용하려면 다음과 같이하십시오. System.out.println ((Double) arrayOfDoubles [0] + (Double) arrayOfDoubles [1]); 모든 Double (s)이 Comparable에서 상속하므로 Collections.sort ()를 통해 쉽게 정렬 할 수 있도록 Double (s)을 Comparable (s)에 채워 넣었 기 때문입니다.
//INDENT TO DISPLAY CODE ON STACK-OVERFLOW
@SuppressWarnings("unchecked")
public static void simpleBubbleSort_ascending(@SuppressWarnings("rawtypes") Comparable[] arrayOfDoubles)
{
//VARS
//looping
int end = arrayOfDoubles.length - 1;//the last index in our loops
int iterationsMax = arrayOfDoubles.length - 1;
//swapping
@SuppressWarnings("rawtypes")
Comparable tempSwap = 0.0;//a temporary double used in the swap process
int elementP1 = 1;//element + 1, an index for comparing and swapping
//CODE
//do up to 'iterationsMax' many iterations
for (int iteration = 0; iteration < iterationsMax; iteration++)
{
//go through each element and compare it to the next element
for (int element = 0; element < end; element++)
{
elementP1 = element + 1;
//if the elements need to be swapped, swap them
if (arrayOfDoubles[element].compareTo(arrayOfDoubles[elementP1])==1)
{
//swap
tempSwap = arrayOfDoubles[element];
arrayOfDoubles[element] = arrayOfDoubles[elementP1];
arrayOfDoubles[elementP1] = tempSwap;
}
}
}
}//END public static void simpleBubbleSort_ascending(double[] arrayOfDoubles)
참고 URL : https://stackoverflow.com/questions/17840483/how-to-have-java-method-return-generic-list-of-any-type
'ProgramingTip' 카테고리의 다른 글
특정에서 특정 HTTP 오류 잡기 (0) | 2020.12.03 |
---|---|
이메일 주소를 자동 감지 할 수 없습니다. (0) | 2020.12.03 |
Sublime Text 3에서 Solarized (Light) 테마를 어떻게 편집합니까? (0) | 2020.12.03 |
@Input 속성이 각도 2의 onInit에서 정의되지 않습니다. (0) | 2020.12.03 |
Log4Net 구성 로그 수준 (0) | 2020.12.03 |