Передача анонимного типа в аннотацию - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу передать анонимный тип аннотации. Поскольку я не знаю, как правильно объяснить мою проблему словами, я просто объясню свое намерение и свой код.

В настоящее время я пишу сериализатор / десериализатор для Java в JSON. Каждый класс должен затем реализовать определенный c интерфейс для сериализации, и каждое поле также нуждается в аннотации, так что мой сериализатор знает, какие поля для сериализации.

@Retention(RetentionPolicy.RUNTIME)
@Target(FIELD)
public @interface SerializeField {
    Class<? extends Formatter> formatter();
}

Теперь я добавил возможность указать форматер, который генерирует строку для поля.

public interface Formatter<T> {
    public abstract String format(T object);
}

Это прекрасно работает, когда я просто создаю новый класс, который реализует Formatter, но не работает, когда я создаю анонимный класс или использую лямбда-выражение.

public class Test implements Javonable {

    //This does not work
    Formatter<BigDecimal> bigDecimalFormatter = (BigDecimal object) -> object.toString();

    @SerializeField(formatter = bigDecimalFormatter.getClass())
    private BigDecimal bigDecimal; // ^ The value for annotation attribute SerializeField.formatter must be a class literal

    //This does work
    @SerializeField(formatter = BigIntegerFormatter.class)
    private BigInteger bigInteger;

    public class BigIntegerFormatter implements Formatter<BigInteger> {
        @Override
        public String format(BigInteger object) {
            return object.toString();
        }
    }
}

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

...