需要一个封闭的实例......?

时间:2012-03-07 02:17:29

标签: java

我想知道是否有人知道如何解决此错误?当我尝试将它们变成AbstractPlayerImpl时,它会出现在playerA,playerB和playerC中。错误说“需要一个封闭的实例”

/**
 * Test the getNextPlayer method.
 * 
 * @throws IllegalPlayerNameException thrown if the player name is invalid.
 */
@Test
public void testGetNextPlayer()
        throws IllegalPlayerNameException
{
    final AbstractTurnBasedGameImpl game;
    final PlayerNameValidator validator;
    final PlayerNameConverter converter;
    final Player playerA;
    final Player playerB;
    final Player playerC;

    validator = DefaultPlayerNameValidator.create();
    converter = DefaultPlayerNameConverter.create();
    playerA = new AbstractPlayerImpl("A",
                                     validator, converter);
    playerB = new AbstractPlayerImpl("B",
                                     validator, converter);
    playerC = new AbstractPlayerImpl("C",
                                     validator, converter);
    game = new AbstractTurnBasedGameImpl (playerA, playerB, playerC);

/**
 * A simple player.
 */
public class AbstractPlayerImpl extends AbstractPlayer 
{
    /**
     * Construct an AbstractPlayerImpl with the specified arguments.
     * 
     * @param nm the player name.
     * @param validator used to check the player name.
     * @param converter used to convert the player name.
     * 
     * @throws IllegalPlayerNameException if the player name is invalid. 
     */
    public AbstractPlayerImpl(
            final String nm,
            final PlayerNameValidator validator,
            final PlayerNameConverter converter) 
            throws IllegalPlayerNameException 
    {
        super(nm, validator, converter);
    }
}

3 个答案:

答案 0 :(得分:1)

你是否在同一个文件中声明这两个类?如果是这样,你最好将它们拆分或使嵌套类(即在另一个中声明的那个)'静态':

static class PlayerImpl extends AbstractPlayer

我知道你使用了不同的名字,但是请不要将具体类称为以“Abstract”开头的名字!程序员使用以“Abstract ...”开头的名称约定给抽象类!调用AbstractPlayerImpl类是完全矛盾的(抽象实现????)

答案 1 :(得分:0)

如果Player是AbstractPlayerImpl的子类型,那么您尝试的内容才有效。换句话说,Player必须扩展AbstractPlayerImpl。

 public class Player extends AbstractPlayerImpl

如果Player是超类,那么这将不起作用。

记住,孩子就像它的父母一样;父母不喜欢它的孩子。

答案 2 :(得分:0)

“需要封闭实例”表示已尝试在静态(或超出定义外层)上下文中创建inner class。内部类 - 它们是[静态]嵌套类的特殊子集 - 被“绑定”到特定的包含对象,因此只能在适用的外部类实例的上下文中创建

  

作为内部类[es]实例的对象存在于外部类的实例中。

很可能在重构的某个地方,一些原始类被留作内部类,现在被用在一个超出定义类的上下文中:然后创建所有正常(例如非内部)类。 (另外,为了理智,请确保没有重复的类和任何旧类文件已被清除。)

快乐的编码。