Soru Java yöntemi herhangi bir türün genel listesini nasıl döndürür?


Geri dönecek bir yöntem yazmak istiyorum java.util.List her türlü hiçbir şeyi tahmin etme gereği duymadan:

List<User> users = magicalListGetter(User.class);

List<Vehicle> vehicles = magicalListGetter(Vehicle.class);

List<String> strings = magicalListGetter(String.class);

Yöntem imzası neye benziyordu? Böyle bir şey, belki de (?):

public List<<?> ?> magicalListGetter(Class<?> clazz) {
    List<?> list = doMagicalVooDooHere();

    return list;
}

Şimdiden teşekkürler!


51
2017-07-24 17:03


Menşei


Listenin yansıtma yoluyla doldurulmasını ister misiniz? Aksi takdirde sadece kullanın new ArrayList<>(). - Paul Bellora


Cevaplar:


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;
}

Bir yönteme de jenerik tip parametresi verilebilir. Bir şeyleri yaratmak için doğru sınıf örneğine ihtiyaç olduğunu doğru bir şekilde anladınız (klazz.getConstructor().newInstance()).


96
2017-07-24 17:06





Sınıfı geçmeye bile gerek yok:

public <T> List<T> magicalListGetter() {
    return new ArrayList<T>();
}

16
2017-07-25 04:53



Öğe eklemek istediğinizde bir sınıfa geçmeniz gerektiğini düşünüyorum. - zygimantus


Başka bir seçenek aşağıdakileri yapmaktır:

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);

'


2
2017-08-05 08:01





Alalım List<Object> objectList biz yapmak istediğimiz 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;
}

2
2018-02-20 08:57





Eski yolu kullanabilirsiniz:

public List magicalListGetter() {
    List list = doMagicalVooDooHere();

    return list;
}

ya da kullanabilirsiniz Object ve her şeyin ana sınıfı:

public List<Object> magicalListGetter() {
    List<Object> list = doMagicalVooDooHere();

    return list;
}

Not Belki de listeye koyacağınız tüm nesneler için daha iyi bir ebeveyn sınıfı var. Örneğin, Number koymak için izin verir Double ve Integer Orada.


1
2017-07-24 17:06





Böyle bir şey

publiс <T> List<T> magicalListGetter(Class<T> clazz) {
    List list = doMagicalVooDooHere();
    return list;
}

1
2017-07-24 17:08



neden geçiyor clazz eğer kullanmayacaksan? - newacct
sorudaki gibi, muhtemelen OP bunu bir şekilde kullanacak. - Evgeniy Dorofeev


Listeye dökebilir ve ardından her öğenin T'ye dökülüp dökülmeyeceğini kontrol edebilirsiniz.

public <T> List<T> asList(final Class<T> clazz) {
    List<T> values = (List<T>) this.value;
    values.forEach(clazz::cast);
    return values;
}

0
2018-03-08 10:42





Bir uyarı oluşturacak olan <stuff> 'i tamamen silebileceğine ve bir @ @ suppress uyarısı kullanabileceğine eminim. Eğer gerçekten jenerik olmasını istiyorsanız, ancak herhangi bir elemanını kullanmak için tip dökümü yapmanız gerekir. Örneğin, basit bir kabarcık sıralama işlevi yaptım ve listeyi sıralarken genel bir tür kullanıyor. Bu, aslında bu durumda Karşılaştırılabilir bir dizi. Bir öğeyi kullanmak isterseniz, aşağıdaki gibi bir şey yapın: System.out.println ((Double) arrayOfDoubles [0] + (Double) arrayOfDoubles [1]); Çünkü Double (s) 'lerin Karşılaştırılabilirlikten elde ettiği tüm Double (ler) i devraldığı için, Polymsorphism olan Karşılaştırılabilir (ler) in içine doldurdum.

        //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)

-1
2017-07-24 17:25