0

重複の可能性:
Javaジェネリック:List<SubClass>をList<SuperClass>にキャストできませんか?

継承クラスを作成するいくつかの基本クラスに関数を作成したいと思います。

私はこれを試しました:

class BaseFormat
{
    // Some variables

    public BaseFormat(string txt)
    {
        // Do something
    }

    public static <T> ArrayList<T extends BaseFormat> getTextFormat(String[] txt)
    {
        ArrayList<T> list = new ArrayList<T>();
        for (int i = 0; i < txt.length; i++)
        {
            list.add(new T(txt[i])); // ERROR
        }
        return list;
    }
}

class FooFormat extends BaseFormat
{
    // Some variables

    public FooFormat (string txt)
    {
        // Do something
    }
}

この:

class BaseFormat
{
    // Some variables

    public BaseFormat(string txt)
    {
        // Do something
    }

    public static ArrayList<BaseFormat> getTextFormat(String[] txt)
    {
        ArrayList<T> list = new ArrayList<T>();
        for (int i = 0; i < txt.length; i++)
        {
            list.add(new BaseFormat(txt[i]));
        }
        return list;
    }
}

しかし、配列をキャストしようとすると、エラーが発生します。これは私のコードです:

String[] txts = ...; // Some texts
ArrayList<FooFormat> list = (ArrayList<FooFormat>) BaseFormat.getTextFormat(txts); // Casting ERROR

では、どうすればそれを実行できますが、それでも汎用性を維持できますか?

4

4 に答える 4

0

やってみてください

  ArrayList<BaseFormat> list = (ArrayList<BaseFormat>) BaseFormat.getTextFormat(txts);

次に、反復時に、instanceOf演算子をチェックしてアイテムをFooFormatにダウンキャストできます。

于 2012-10-15T17:42:37.243 に答える
0

あなたは次のように何かをしようとしていますか

class BaseFormat { }

class FooFormat extends BaseFormat { }

class FormatUtils {
    public static <T extends BaseFormat> List<T> getTextFormat(String[] txt, Class<T> clazz) {
        List<T> list = new ArrayList<T>();
        //... 
                T t = clazz.newInstance(); //create instance using reflection
                //...
        return list;
    }
}

そして、やります

List<FooFormat> list = FormatUtils.getTextFormat(new String[]{}, FooFormat.class);
于 2012-10-15T17:50:31.527 に答える
0

つまり、動的型付けを可能にするジェネリックスと、メソッドのオーバーライドを可能にする継承を混在させています。本当に必要なのは、ラップされた文字列の作成とリストの作成を分離することです。

class BaseFormat
{
  // derived classes override this method to provide their own implementations
  public abstract BaseFormat wrapText(String[] txt);

  public ArrayList<? extends BaseFormat> getTextFormat(String[] txt)
  {
    ArrayList<? extends BaseFormat> list = new ArrayList<BaseFormat>();
    for (int i = 0; i < txt.length; i++)
    {
        list.add(wrapText(txt);
    }
    return list;
  }
}
于 2012-10-15T17:51:53.930 に答える
0

タイプをパラメーターとして静的メソッドに渡してから、おそらくリフレクションを使用してを呼び出す必要がありClass.newInstanceます。型消去とは、コンパイル後に具体的な型Tがないことを意味するため、コンパイルできません。new T(...)

于 2012-10-15T17:57:13.450 に答える