Java generi c привязано к пользовательскому интерфейсу - PullRequest
0 голосов
/ 11 июля 2020

Я хочу иметь общий c класс A, «значением» которого может быть только JSON -сериализуемый объект. Для этого я решил реализовать интерфейс самостоятельно. Проблема в том, что я хочу избежать следующего использования:

A a = new A("name", new BooleanType(false)); // I would like to just pass false as the argument

Моя настройка такая:

Class A <T extends Type> {
    private String name;
    private T value;

    //getter...
}

-

Interface Type {
   Object value;
}

-

Class BooleanType implements Type {
    private Boolean value;

    public BooleanType(Boolean value){
        this.value = value;
    }

}

другие разработчики типов ...

Одна из моих идей заключалась в том, чтобы иметь метод для каждого типа в классе A:

Class A <T extends Type> {
    private String name;
    private T value;

    public static A of(String name, Boolean value){
        this.name = name;
        this.value = value;
    }

    //of implementations for Integer, LocalDatetime, etc

    //getter...
}

Могу ли я достичь этого, не имея нескольких методы в A для создания каждого отдельного типа?

1 Ответ

0 голосов
/ 11 июля 2020

Вы создаете проблему. Чтобы удалить требование верхней границы, вам необходимо удалить интерфейс. Вам не нужен интерфейс, потому что все * объекты и примитивы поддерживаются Gson.

При этом, если вы хотите, чтобы класс A разрешал пару ключ-значение, вы можете иметь параметр V представляет value и задает тип по умолчанию. Затем используйте шаблон адаптера для реализации этого интерфейса и составьте его из соответствующего объекта.

interface MyType<V> {

    String name();
    
    V value();

}
class MyTypeAdapter<V> implements MyType<V> {

    private final String name;

    private final V value;

    public MyTypeAdapter(String name, V value) { 
        this.name = name;
        this.value = value;
    }

    @Override
    public V value() {
        return value;
    }

    @Override
    public String name() {
        return name;
    }

} 
MyType<Boolean> myTypeAdapter = new MyTypeAdapter<>("foo", false);

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