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 回答