Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java抽象类函数泛型类型_Java_Class_Polymorphism_Gson_Abstract - Fatal编程技术网

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