Java抽象类函数泛型类型
我为我的Java抽象类函数泛型类型,java,class,polymorphism,gson,abstract,Java,Class,Polymorphism,Gson,Abstract,我为我的ArrayList持有者创建了抽象类 public abstract class ArrayHolder { Gson g = new Gson(); } 像 public class MyHolder extends ArrayHolder { ArrayList<MyType> myList = new ArrayList<MyType>(); } 在子类中使用它 public void fillData(String data){
ArrayList
持有者创建了抽象类
public abstract class ArrayHolder {
Gson g = new Gson();
}
像
public class MyHolder extends ArrayHolder {
ArrayList<MyType> myList = new ArrayList<MyType>();
}
在子类中使用它
public void fillData(String data){
myList = arrayType(data, MyType.class);
}
我怎样才能正确地做到这一点
谢谢试试这个
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()));
}
}
公共抽象类ArrayHolder{
Gson g=新的Gson();
公共ArrayList arrayType(字符串数据){
返回g.fromJson(数据,TypeToken.get(新的ArrayList().getClass());
}
}
使用
公共类MyCollection扩展了ArrayHolder{
私人收藏;
公共void setData(字符串数据){
集合=阵列类型(数据);
}
}
公共ArrayList arrayType(字符串数据){
返回g.fromJson(数据,newTypeToken(){}.getType());
}
这样做:
public <T> ArrayList<T> arrayType(String data){
return g.fromJson(data, new TypeToken<ArrayList<T>>(){}.getType());
}
publicArrayList arrayType(字符串数据){
返回g.fromJson(数据,newTypeToken(){}.getType());
}
我没有涉及泛型类型方法,但从我所看到的来看,这是对的。如果我理解正确:你有一个超类C,你想让它通过子类D填充ArrayList,然后在C中填充抽象方法?@RyanAmos right。但不直接填充,只需返回正确类型的ArrayList啊,那么只需使用T.new ArrayList。您不需要t type参数。
TypeToken
不应该使用匿名内部类创建,而应该使用TypeToken.get(…)
@JohnB通过内部类创建TypeToken有什么不好的地方?您不知道Google在实现中需要哪些非公开的抽象方法。他们将类抽象并隐藏实际的实现类作为数据隐藏机制。这就是为什么它们提供了get
方法来检索一个具体实例。两个代码都会抛出一个错误method getType()未声明类型ArrayList
我明白了,请在下面的@RyanAmos answer上回答,为什么通过内部类的TypeToken是坏的?NP,请注意,您不需要将类型作为参数传递给您的方法。我忘了把它取下来,明白了。这正是我所需要的:)在你的答案中添加了示例用法。你的答案最接近解决方案,我将列表中的类型更改为ArrayList,并添加了缺少的括号。
public class MyCollection extends ArrayHolder {
private ArrayList<MyType> collection;
public void setData(String data){
collection = arrayType(data);
}
}
public <T> ArrayList<T> arrayType(String data){
return g.fromJson(data, new TypeToken<ArrayList<T>>(){}.getType());
}
public <T> ArrayList<T> arrayType(String data){
return g.fromJson(data, new TypeToken<ArrayList<T>>(){}.getType());
}