ProgramingTip

Java 메서드가 모든 유형의 일반 목록을 반환하는 방법은 무엇입니까?

bestdevel 2020. 12. 3. 08:16
반응형

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당신은 넣을 수 있습니다 것입니다 DoubleInteger거기에.


이 같은

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

반응형