Ошибка "поле должно быть инициализировано с помощью реализующего экземпляра интерфейса"? - PullRequest
0 голосов
/ 01 января 2019
    public class Player implements Comparable<Player> {

//Fields
private Name name;
private Rollable rollable;

//Constructors
public Player() {
    name = new Name();
    rollable = new Rollable();
}
public Player(Name name) {
    this.name = name;
    rollable = new Rollable();
}
public Player(Name name, Rollable rollable) {
    this.name = name;
    this.rollable = rollable;
}

Здравствуйте, для моих конструкторов, куда я положил rollable = new Rollable(); Я получаю ошибку, которая утверждает, что это Cannot instantiate the type rollable.Ниже я добавил тест JUnit, а также добавлю код для класса Rollable

        @Test
public void testDefaultConstructor() {
    Player p = new Player();

    assertEquals("Name field should be initialised with a default Name object ", new Name(), p.

getName ());assertTrue («Поле, в котором может быть выполнено обновление игрока, должно быть инициализировано с помощью. реализующего экземпляра интерфейса Rollable», p.getRollable () instanceof Rollable);}

@Test
public void testCustomConstructor1arg() {
    Name n = new Name("Joe", "Bloggs");
    Player p = new Player(n);

    assertSame("Player's name field should be initialised with and      return the same object received by the constructor", n, p.getName()); 
    assertTrue("Player's rollable field should be initialised with an implementing instance of the Rollable interface", p.getRollable() instanceof Rollable);
}

Ниже приведен тест JUnit для конструктора по умолчанию, который также дает мне ошибку Players rollable field should be initialised with an implementing instance of the Rollable interface, однако все остальные мои тесты JUnit проходят.

        @Test
public void testDefaultConstructor() {
    Player p = new Player();

    assertEquals("Name field should be initialised with a default Name object ", new Name(), p.getName());
    assertTrue("Player's rollable field should be initialised with an implementing instance of the Rollable interface", p.getRollable() instanceof Rollable);
}

Код для моего класса Rollable приведен ниже;

    public interface Rollable {

public void roll();

public int getScore();

}

Методы для моего кода Rollable следующие:

        //Methods
public Name getName() {
    return name;
}
public void setName(Name name) {
    this.name = name;
}
public Rollable getRollable() {
    return rollable;
}
public void rollDice() {
    rollable.roll();
}
public int getDiceScore() {
    return rollable.getScore();
}

Вся помощь будетспасибо, что борюсь с неудачами, спасибо.

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Ваш Rollable является интерфейсом, а в Java вы можете создавать только экземпляры неабстрактных классов.

Так что вам нужно написать хотя бы один класс, который implements Rollable.Из этого класса вы можете создавать экземпляры.

Почему это так?

Посмотрите, например, интерфейс Comparable (служащий мне аналогом вашего Rollable).Comparable обозначает классы, которые поддерживают какое-то большее / равное / меньшее сравнение, требуя, чтобы у класса был метод с именем compareTo().Если бы вы создали экземпляр Comparable, что бы вы ожидали получить в результате?A String, Long, Double или что?И то же самое относится к вашему Rollable.

Интерфейс определяет некоторые требования, которым должны удовлетворять реализующие классы, но они не обозначают сами классы, поэтому вы не можете создавать (прямые) экземпляры интерфейсов.

0 голосов
/ 01 января 2019

Ваш метод getRollable():

public Rollable getRollable() {
    return rollable;
}

Итак, если вы вызываете его из конструктора, например:

public Player() {
    name = new Name();
    rollable = getRollable();
}

, тогда rollable будет присвоено значениеrollable, что по умолчанию null.

Таким образом, при повторном вызове getRollable() в тесте вы получаете значение, присвоенное полю - null - иопределение - null instanceof Rollable ложно.

Вместо этого вам необходимо создать новый экземпляр Rollable, например:

rollable = new Rollable();

(Не знаю, можно ли его создать непосредственно. Вы не предоставили объявление класса Rollable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...