【问题标题】:Java abstract class function generic TypeJava 抽象类函数泛型类型
【发布时间】:2012-01-16 06:02:05
【问题描述】:

我为我的ArrayList 持有者创建了抽象类

public abstract class ArrayHolder {
    Gson g = new Gson();
}

习惯了

public class MyHolder extends ArrayHolder {
    ArrayList<MyType> myList = new ArrayList<MyType>();
}

我想创建抽象函数来从StringType 参数填充这个ArrayList

像这样(String dataString中的JSON):这个函数应该重写

public ArrayList<T> arrayType(String data, T type){
    return g.fromJson(data, new TypeToken<ArrayList<type>(){}.getType());
}

在子类中使用它

public void fillData(String data){
    myList = arrayType(data, MyType.class);
}

我怎样才能正确地做到这一点?

谢谢

【问题讨论】:

  • 所以如果我理解正确:你有一个超类 C,你希望它通过 C 中的抽象方法填充子类 D 中的 ArrayList?
  • @RyanAmos 对。但不直接填充,只返回正确类型的ArrayList
  • 啊,那就用 T.new ArrayList。您不需要 T 类型参数。

标签: java class polymorphism gson abstract


【解决方案1】:

试试这个...

public abstract class ArrayHolder {
    Gson g = new Gson();

    public <T> ArrayList<T> arrayType(String data){
        return g.fromJson(data, TypeToken.get(new ArrayList<T>().getClass()));
    }
}

使用

public class MyCollection extends ArrayHolder {
    private ArrayList<MyType> collection;

    public void setData(String data){
        collection = arrayType(data);
    }
}

【讨论】:

  • 两个代码都抛出错误method getType() is undeclared for type ArrayList&lt;T&gt;
  • 我明白了,请在下面@RyanAmos 的回答中回答,为什么 TypeToken via internal class 不好?
  • NP,请注意您不需要将类型作为参数传递给您的方法。我忘了删除它。
  • 你明白了。这正是我需要的:)
  • 在您的答案中添加了示例用法。
【解决方案2】:
public <T> ArrayList<T> arrayType(String data){
    return g.fromJson(data, new TypeToken<ArrayList<T>>(){}.getType());
}

【讨论】:

  • 您的答案最接近解决方案,我将类型从 List 更改为 ArrayList 并添加了缺少的括号。
【解决方案3】:

这样做:

public <T> ArrayList<T> arrayType(String data){
     return g.fromJson(data, new TypeToken<ArrayList<T>>(){}.getType());
}

我没有处理过泛型类型化方法,但据我所见,这是对的。

【讨论】:

  • TypeToken 不应使用匿名内部类创建,而应使用 TypeToken.get(...)
  • @JohnB 通过内部类创建 TypeToken 有什么不好?
  • 你不知道 Google 在实现中需要哪些非公共抽象方法。他们将类抽象化,并将实际的实现类作为数据隐藏机制隐藏起来。这就是他们提供get 方法来检索具体实例的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多