Java:从通用List / Collection派生

时间:2009-06-01 15:52:43

标签: java list generic-list

我在理解Java语言时遇到一些问题

public class PhonebookEntryList extends List<PhonebookEntry>
{
    public PhonebookEntryList(String filename) throws IOException
    {
        //loadListFromFilename(filename);
    }

    public void saveListToFilename(String filename) throws IOException
    {
        //Do something to save it to a file
    }
}

我不能这样做,因为List是一般类型(当然)。我知道这意味着什么,但目前我无法想到解决这个问题的方法。

你可以帮我解决一下吗?感谢名单!

7 个答案:

答案 0 :(得分:3)

不,你唯一的问题是你是extend interface;你必须改为implement

public class PhonebookEntryList implements List<PhonebookEntry>

应该工作;或者您可能更喜欢扩展具体类:

public class PhonebookEntryList extends ArrayList<PhonebookEntry>

public class PhonebookEntryList extends LinkedList<PhonebookEntry>

答案 1 :(得分:3)

你不能那样做因为List是一个界面。但! 您不应该扩展或实现List类来创建PhonebookEntryList,这是一个设计错误。

你应该这样做:

public class PhonebookEntryList
{
    private List<PhonebookEntry> entries;

    public PhonebookEntryList(String filename) throws IOException
    {
        //loadListFromFilename(filename);
    }

    public void saveListToFilename(String filename) throws IOException
    {
        //Do something to save it to a file
    }
}

即。你的PhonebookEntryList应该包含一个列表而不是继承它。

答案 2 :(得分:0)

List<T>是一个接口,而不是一个类,所以你不能继承它。但是,您可以从泛型类型继承,提供类型参数,如果您希望创建,例如,特定类型的集合,其中某些行为仅针对该类型。

答案 3 :(得分:0)

如果你看一下JavaDoc for List,你会看到(正如其他人提到的那样)它是一个界面,而不是一个类。您最想要做的是查看“所有已知实现类”的同一JavaDoc页面,您将看到AbstractList。扩展这个。或者,扩展其中一个非抽象List实现。

注意:大多数时候,当有人开始扩展其中一个Java Collection类时,你的路线就会走错路。通常,最好使用类中的一个现有集合,并代理所需的任何集合式请求。或者返回您的收藏品的不可修改的代理:

public class MyClass {
  private final List<PhonebookEntry> myList = new LinkedList<PhonebookEntry>();

  public List<PhonebookEntry> getList() {
    return Collections.unmodifiableList(myList);
  }
}

通常,只有当您打算使用与您要扩展的类不同的行为时,才最好扩展类。遗传比构图更脆弱。

答案 4 :(得分:0)

List<T>是一个界面。

如果你想要extend一个班级,你必须选择一个实现(ArrayList<T>):extends ArrayList<PhonebookEntry>

如果您要实施List,请将您的代码更改为:implements List<PhonebookEntry>

答案 5 :(得分:0)

您的问题是您正在尝试扩展接口而不是实现它。

你想要的是作文。创建一个包装List的类(或者那些支持该接口的东西)

并添加功能。

答案 6 :(得分:0)

我是否应该提到List是一个接口而不是一个类?罗。我想你现在明白了。

但是,我想指出,通常最好不要在列表类中嵌入持久性机制。有一种叫做访客模式的东西效果更好。通过将实际的持久性代码放在一个单独的类中,应用程序的整体逻辑复杂性会降低(以额外的类为代价),并且您的电话簿将被释放,以便在依赖于持久性机制看起来很好的地方使用当你第一次设计代码时,看起来不再那么好了。例如,如果您想使电话簿成为ORM引用数据库中的项目。