Создание параметра типа и метода переопределения - PullRequest
0 голосов
/ 22 января 2019

Я хочу сделать что-то похожее на подстановочные знаки Scala для сопоставления с образцом, поэтому мне нужно создать экземпляр объекта типа T, который всегда будет возвращать true при вызове equals() - метода.

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

Что у меня естьдо сих пор:

public void match(Object toMatch, Effect0 effect) {
   val bothNull = toMatch == null && value == null;

    val equals = toMatch != null && toMatch.equals(value);

    if(bothNull || equals) {
        effect.f();
    }
}

public static Object any() {
    return new Object() {
        @Override
        public boolean equals(Object o) {
            return true;
        }
    };
}

Но мне нужно как-то поднять any() в тип T.

Использование будет выглядеть так:

myClass.match(new MyClass(any(), "foo", "bar", any()), () -> ...);

Важно то, что я не могу, например, сравнить Pair<String, Integer> с Pair<Integer, String>.Вот почему мне нужны дженерики.

Возможно ли это?

1 Ответ

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

Проще говоря, вы не можете.

Если у вас есть только универсальный параметр T, его невозможно создать, см. здесь для получения подробной информации.Вы можете обойти это, например, передавая экземпляры Class, но это все еще означает отражение и необходимость в конструкторах по умолчанию или эвристику, для которой конструктор должен вызываться.

Но даже если вы можете создать экземпляр T, вы не сможете динамически создать анонимный подкласс для этого.

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