我想知道是否有人知道如何解决此错误?当我尝试将它们变成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);
}
}
答案 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]实例的对象存在于外部类的实例中。
很可能在重构的某个地方,一些原始类被留作内部类,现在被用在一个超出定义类的上下文中:然后创建所有正常(例如非内部)类。 (另外,为了理智,请确保没有重复的类和任何旧类文件已被清除。)
快乐的编码。