Нарушать метод проверки списка общих c объектов - PullRequest
1 голос
/ 08 мая 2020

Это задача из Hyperskill.org .

Инструкции для задачи:

Вам необходимо добавить реализацию в Violator.defraud ( ), который будет выполнять следующие действия:

Создать список ящиков в соответствии с сигнатурой метода Поместить объект Paper хотя бы в один ящик в списке Полученный список должен пройти проверку NaiveQualityControl. Не следует изменять сигнатуру метода или изменять код любых других классов, просто добавьте реализацию к методу обмана.

/* This class and its subclasses should pass quality check */
class Bakery {}

class Cake extends Bakery {}

/* But this should not */
class Paper {}

/* These boxes are used to pack stuff */
class Box<T> {
    void put(T item) { /* implementation omitted */ }
    T get() { /* implementation omitted */ }
}

/* This quality checker ensures that boxes for sale contain Bakery and anything else */
class NaiveQualityControl {

  public static boolean check(List<Box<? extends Bakery>> boxes) {
    /* Method signature guarantees that all illegal 
       calls will produce compile-time error... or not? */  
    return true;  
  }

}

Это метод, который нужно реализовать;

class Violator {

    public static List<Box<? extends Bakery>> defraud() {
        // Add implementation here
    }

}

Пока что у меня есть это;

public static List<Box<? extends Bakery>> defraud() {
        List<Box<? extends Bakery>> boxList = new ArrayList<>();

        Box<Paper> paperBox = new Box<>();
        Box<Bakery> bakeryBox = new Box<>();
        Box<Cake> cakeBox = new Box<>();

        boxList.add(bakeryBox);
        boxList.add(cakeBox);
        boxList.add(paperBox); // compile time error, required type <? extends Bakery>

        return boxList;
    }

Очевидно, это не запустится. Я пробовал использовать Object как тип, но это выходит за рамки <? extends Bakery>. Я не могу преобразовать paperBox в тип <? extends Bakery Box.

1 Ответ

2 голосов
/ 08 мая 2020

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

public List<Box<? extends Bakery>> defraud() {
    List<Box<? extends Bakery>> boxList = new ArrayList<>();

    Box<Paper> paperBox = new Box<>();
    Box<Bakery> bakeryBox = new Box<>();
    Box<Cake> cakeBox = new Box<>();

    boxList.add(bakeryBox);
    boxList.add(cakeBox);

    List rawTypedList = boxList;    // Drop the generics to use raw types. 
    rawTypedList.add(paperBox);
    rawTypedList.add(new Object()); // Acutally, you can add any object, not just Boxes.

    return boxList;
}

. Вы получите предупреждение от компилятора или IDE для использования необработанных типов хотя - считается плохой практикой .

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