Я хочу использовать интерфейс (FieldTemplate в моем случае) в качестве универсального типа c для GraphQLResolver, но, похоже, я застрял только с обходным приемом, описанным ниже, из-за того, как библиотека, похоже, ищет более "конкретные" типы (NumberFieldTemplate, TextFieldTemplate и т. д. c. в моем случае). Есть идеи, как мне создать упрощенную версию ниже? В идеале я бы хотел express это всего лишь один компонент Spring с использованием интерфейса: FieldTemplate. Кстати, код ниже находится в Kotlin. Я использую библиотеку graphql- java.
@Component
class NumberFieldTemplateResolver :
FieldTemplateResolver<NumberFieldTemplate>(), GraphQLResolver<NumberFieldTemplate>
@Component
class TextFieldTemplateResolver :
FieldTemplateResolver<TextFieldTemplate>(), GraphQLResolver<TextFieldTemplate>
@Component
class LabelFieldTemplateResolver :
FieldTemplateResolver<LabelFieldTemplate>(), GraphQLResolver<LabelFieldTemplate>
@Component
class ComboBoxFieldTemplateResolver :
FieldTemplateResolver<ComboBoxFieldTemplate>(), GraphQLResolver<ComboBoxFieldTemplate>
@Component
class CheckFieldTemplateResolver :
FieldTemplateResolver<CheckFieldTemplate>(), GraphQLResolver<CheckFieldTemplate>
abstract class FieldTemplateResolver<T : FieldTemplate> {
fun screenBox(fieldTemplate: T, displayUnit: DisplayUnit?): ScreenBox = when (displayUnit) {
DisplayUnit.PIXELS -> screenBoxInPixels(fieldTemplate.screenBox)
else -> fieldTemplate.screenBox
}
}
Моя схема GraphQL выглядит примерно так ...
interface FieldTemplate {
id: ID!
}
type NumberFieldTemplate implements FieldTemplate {
id: ID!
...
}
type TextFieldTemplate implements FieldTemplate {
id: ID!
...
}
...