Как преобразовать JsValue в класс моделей с помощью Scala в платформе Play?

Что касается оператора

каждый раз, когда я пытался удалить дополнительный - никаких новых ошибок / предупреждений не было.

blockquote>

Это не должно быть дело. Он должен печатать предупреждение, потому что вы используете raw type Some, и в результате этого отсутствует безопасность типа, как показано в ответе на newacct .


Пример Dog / Cat немного надуман и несколько испорчен. Вы предложили объявить класс

public class Dog extends Animal { } // Note "Cat" !!!

. Но здесь параметр типа в основном означает: «Этот параметр (Cat) является типом, который объекты этого класса (Dog) могут быть по сравнению с ". Таким образом, вы явно заявляете , что Dog должен быть сопоставим с Cat. В конце концов, даже разработчикам сложного языка и умных компиляторов приходится программировать код, который имеет смысл.


Действительно, не так много случаев, когда эти самореферентные общие типы необходимо. Один из этих примеров нарисован в этой записи в FAQ: Он объявляет структуру узлов (то есть дерево), где параметр типа может использоваться для отграничения определения структуры дерева / g5] из фактического типа узлов:

public class RecurringTest {
    public static void main(String[] args) {
        SpecialNode sa = new SpecialNode(null);
        SpecialNode sb = new SpecialNode(sa);
        SpecialNode s = sa.getChildren().get(0);
    }
}

abstract class Node> {
    private final List children = new ArrayList();
    private final N parent;

    protected Node(N parent) {
        this.parent = parent;
        if (parent != null) {
            this.parent.getChildren().add(getThis());
        }
    }

    abstract N getThis();

    public N getParent() {
        return parent;
    }

    public List getChildren() {
        return children;
    }
}

class SpecialNode extends Node {
    public SpecialNode(SpecialNode parent) {
        super(parent);
    }

    SpecialNode getThis() {
        return this;
    }

}

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

Node, T> doSomething(
    Node, ? extends T> p, 
    Node, ? super T> c) { ... }

, которые являются безопасными по типу, или такими методами, как

Node doSomething(Node parent, Node child) { ... }

, которые не являются безопасными типа (из-за необработанных типов или просто потому, что типы не были обобщены), тогда я предпочел бы последний. Код читается людьми.

0
задан Mahmoud Hanafy 31 December 2018 в 16:03
поделиться