0

想象一下:

每个单词都是一个字符列表。然而,字符本身不能有,它总是必须是单词的一部分。

所以 Word 类可能如下所示:

class Word extends List<MyCharacter>

现在,如何强制实例化MyCharacter不属于 a 的 a 是不可能的Word?也许制作MyCharacter一个私有内部类Word并添加一个类似的addCharacter(String character)方法Word?但是,如果是私有内部类,是否可以让Word扩展 List 类?MyCharacterWord

感谢您对此的任何提示!

更新:

我现在结束了

import java.util.ArrayList;

public final class Word extends ArrayList<Word.MyCharacter> {

    protected final class MyCharacter
    {
        private String character;

        public String getCharacter() {
            return character;
        }

        public MyCharacter(String character)
        {
            this.character=character;
        }
    }

    public void addCharacter(String character) {
        add(new MyCharacter(character));
    }   
}

以下是它的使用方法:

public static void main(String[] args) {

    Word word = new Word();

    // word.add(new MyCharacter("a")); // as intended: not possible, because MyCharacter class can't be accessed
    word.addCharacter("a"); // ok           
}
4

2 回答 2

1

也许让 Character 成为 Word 的私有内部类并向 Word 添加像 addCharacter(String character) 这样的方法?

是的。- 或者也许只声明MyCharacterprivate 和MyCharacterclass的构造函数final。或者在具有“包私有”构造函数MyCharacter之外声明该类。或者在内部有Word一种(静态)工厂方法和一个私有构造函数。或者 ... :-)MyCharacterappendToWord( Word w, Character char )

编辑:我首先误解了这个问题:

是否可以让 Word 使用私有内部 Character 类扩展 List 类?

Word可以以任何方式扩展List<T>。但是 - 正如你所知道的那样 - 不是List<Word.SomeInnerClass>

于 2013-03-29T11:57:09.473 回答
1

这在理论上是可能的。一个问题会出现,因为Character它已经是一个 java 类。此外,如果您使用的是 Eclipse,它不会让您声明

public class Word extends ArrayList<Letter> {
    private class Letter {
        //...
    }
}

除非您将 Letter 设置为最多受保护。我不确定这是否是 Eclipse 问题,或者 Java 是否也会阻止您。

Regarding your superclass problem, it's because you cannot use List as it is only an interface. You must use something that implements it, like ArrayList.

于 2013-03-29T12:05:24.587 回答