web-dev-qa-db-ja.com

Javaでジェネリックリスト型をキャストする方法は?

さて、私はクラスCustomer(基本クラスなし)を持っています。

LinkedListからListにキャストする必要があります。これを行うクリーンな方法はありますか?

ちょうどあなたが知っているように、私はそれをリストにキャストする必要があります。他のタイプではできません。 (私はSlimとFitNesseを使用してテストフィクスチャを開発しています)。


編集:さて、私はここにコード例を与える必要があると思います。

import Java.util.*;
public class CustomerCollection
{
    protected LinkedList<Customer> theList;

    public CustomerCollection()
    {
        theList = new LinkedList<Customer>();
    }

    public void addCustomer(Customer c){ theList.add(c); }
    public List<Object> getList()
    {
        return (List<? extends Object>) theList;
    }
}

したがって、Yuval Aの発言に従って、最終的にこの方法でコードを記述しました。しかし、私はこのエラーを受け取ります:

CustomerCollection.Java:31: incompatible types
found   : Java.util.List<capture#824 of ? extends Java.lang.Object>
required: Java.util.List<Java.lang.Object>
        return (List<? extends Object>)theList;
               ^
1 error

それで、このキャストを行う正しい方法は何ですか?

15
jrharshath

キャストする必要はありません。 LinkedListListを実装しているため、ここでキャストする必要はありません。

ListObjectにダウンキャストする場合でも、次のコードのようなジェネリックを使用して行うことができます。

LinkedList<E> ll = someList;
List<? extends Object> l = ll; // perfectly fine, no casting needed

さて、あなたの編集の後、私はあなたが何をしようとしているのか理解しました、そしてそれは新しいListを作成することなしには不可能です:

LinkedList<E> ll = someList;
List<Object> l = new LinkedList<Object>();
for (E e : ll) {
    l.add((Object) e); // need to cast each object specifically
}

それ以外の理由でこれが不可能な理由を説明します。このことを考慮:

LinkedList<String> ll = new LinkedList<String>();
List<Object> l = ll; // ERROR, but suppose this was possible
l.add((Object) new Integer(5)); // now what? How is an int a String???

詳しくは Sun Javaジェネリックのチュートリアル をご覧ください。

29
Yuval Adam

キャストを行うための私の恐ろしい解決策は次のとおりです。私は知っています、私は知っています、私はこのようなものを野生にリリースするべきではありませんが、オブジェクトを任意のタイプにキャストするのに便利です:

public class UnsafeCastUtil {

    private UnsafeCastUtil(){ /* not instatiable */}

    /**
    * Warning! Using this method is a sin against the gods of programming!
    */
    @SuppressWarnings("unchecked")
    public static <T> T cast(Object o){
        return (T)o;
    }

}

使用法:

Cat c = new Cat();
Dog d = UnsafeCastUtil.cast(c);

今、私は自分の罪のためにプログラミングの神々に祈るつもりです...

19
logan

私はそのためにこの機能を実行しました、醜いですが、うまくいきます

public static <T> Collection<T> cast(Collection<? super T> collection, Class<T> clazz){
    return (Collection<T>)collection;
}
2
julman99
>    public List<Object> getList()

なぜList <Object>を返すのですか?これは同等ですが、次のコードを機能させるため、List(ジェネリックなし)を返すこともできます。

LinkedList<Customer> theList = new LinkedList<Customer>();

public List getList() {
    return theList;
}

ジェネリック型が異なるリスト間のキャストはトリッキーであり、ここでは不要のようです。

もちろん、タイプList <Customer>を返す必要があります...

1
Kris

置くだけ

public static List<Object> getList() {
    List l = test;
    return l;
}
0
Ravi Parekh

あなたのリストが例えばのためのジェネリックタイプのものであるなら

ArrayList<String> strList = new ArrayList<String>(); strList.add("String1"); Object o = strList;

その後、次のメソッドが機能するはずです

public <T> List<T> getListObjectInBodyOfType(Class<T> classz, Object body) {
    if(body instanceof List<?>){
        List<?> tempList = (List<?>)body;
        if(tempList.size() > 0 && tempList.get(0).getClass().equals(classz)){
            return (List<T>) body;
        }
    }
    return new ArrayList<T>();
}

どうやって使うのですか?

List<String> strList1 = getListObjectInBodyOfType(String.class, o);

前に述べたように、オブジェクトにジェネリックリストが含まれている場合は機能しますが、タイプが異なる要素を含むジェネリック以外のリストを渡すと機能しません

0
Vishal

メソッドから_List<?>_を返す必要があります。直感的に、getList()はリストを返し、呼び出し元は内部のアイテムを取得できます。 _List<?>_(_List<? extends Object>_と同等)は、その機能を許可します。ただし、タイプセーフではないため、返されたリストを介してリストに何かを入れることはできません。とにかくそれが必要だとは思いません。

_public List<?> getList()
{
    return theList;
}
_
0
newacct

LinkedListはListを実装しているため、実装できます

List< String > list1 = new LinkedList< String >(); 

または、LinkedList <String>からList <int>にキャストしますか?この場合は、すべての要素を選択して整数に変換する必要があります。

0
Markus Lausberg