1

我对 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 是一个通用类型(当然)。我知道这意味着什么,但目前我想不出这个问题的解决方案。

你能帮我解决吗?谢谢!

4

7 回答 7

3

不,您唯一的问题是您正在extend使用interface; 你必须implement改为。

public class PhonebookEntryList implements List<PhonebookEntry>

应该管用; 或者您可能更喜欢扩展一个具体的类:

public class PhonebookEntryList extends ArrayList<PhonebookEntry>

或者

public class PhonebookEntryList extends LinkedList<PhonebookEntry>
于 2009-06-01T15:55:47.887 回答
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 应该包含一个列表而不是继承它。

于 2009-06-01T15:56:22.507 回答
0

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

于 2009-06-01T15:55:57.467 回答
0

如果您查看JavaDoc forList,您会看到(正如其他人提到的)它是一个接口,而不是一个类。您最可能想要做的是在“所有已知的实现类”中查看同一个 JavaDoc 页面,您会看到AbstractList. 扩展这个。或者,扩展其中一个非抽象List实现。

注意:大多数情况下,当有人开始扩展 Java Collection 类之一时,您会走错路。通常,最好使用类中现有的集合之一并代理您需要的任何集合样式的请求。或返回您的收藏的不可修改的代理:

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

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

通常,最好仅在您打算具有与要扩展的类不同的行为时才扩展类。继承比组合更脆弱。

于 2009-06-01T15:58:13.020 回答
0

List<T>是一个接口。

如果你想extend上课,你必须选择一个实现(ArrayList<T>也许):extends ArrayList<PhonebookEntry>

如果您想将List代码更改为:implements List<PhonebookEntry>

于 2009-06-01T15:59:34.423 回答
0

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

构图就是你想要的。创建一个包装列表的类(或实现该接口的东西)

并添加功能。

于 2009-06-01T16:00:02.863 回答
0

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

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

于 2009-06-01T16:08:25.827 回答