2011-12-08 20 views
2

我创建抽象类我ArrayList持有者Java的抽象类功能的通用型

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

我怎样才能做到这正常吗?

感谢

+0

所以,如果我明白这个权利:你有一个超类C,你想要它通过C中的抽象方法填充子类D中的ArrayList? –

+0

@RyanAmos吧。但是不是直接填写,只是返回右边类型的ArrayList –

+0

啊,刚好使用T. new ArrayList 。你不需要T型参数。 –

回答

3

尝试......

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); 
    } 
} 
+0

这两个代码都抛出一个错误'方法getType()未声明类型ArrayList ' –

+0

是的,这是泛型的麻烦。查看我的更新。 –

+0

我看,请在@RyanAmos回答下面回答,为什么通过内部类的TypeToken不好? –

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

您的答案与解决方案最接近,我从List中将类型更改为ArrayList并添加了缺少的括号。 –

2

做这样的:

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

我没有处理泛型类型的方法,但从我所看到的情况来看,这是正确的。

+0

不应使用匿名内部类来创建'TypeToken',而是使用'TypeToken.get(...)' –

+0

@JohnB通过内部类创建TypeToken有什么不好? –

+0

您不知道Google在实施过程中需要什么非公共抽象方法。他们将抽象类作为数据隐藏机制,将实际的实现类隐藏起来。这就是为什么他们提供'get'方法来检索具体实例。 –