Base trait for annotations which aggregate multiple other annotations.
When applied on varargs parameter, indicates that at least some number of parameters is required.
When applied on varargs parameter, indicates that at least some number of parameters is required.
This is later checked by the static analyzer.
WARNING: implementation of method which takes a varargs parameter may NOT assume that given number of
arguments will always be passed, because it's still possible to pass a Seq
where
varargs parameter is required using the : _*
ascription, e.g.
varargsMethod(List(): _*)
and that is not checked by the static analyzer.
When applied on generic method, requires that all the type parameters are given explicitly (cannot be inferred by the compiler).
When applied on generic method, requires that all the type parameters are given explicitly
(cannot be inferred by the compiler). This is meant primarily for methods whose generics cannot be
inferred from method arguments. Requiring that the programmer specifies them explicitly is a protection
against the compiler inferring Nothing
or Null
.
@explicitGenerics def readJson[T: GenCodec](json: String): T = ... // raise error, because otherwise we have a hidden bug - the compiler infers `Nothing` in place of `T` val x: MyType = readJson("{}") // ok val x = readJson[MyType]("{}")
Symbols annotated with this annotation can only be used in macro-generated code.
Base trait for annotations which aggregate multiple other annotations. This way annotation aggregates work like "annotation functions" - they are annotations that yield more annotations.
In order to specify aggregated annotations, the class that extends
AnnotationAggregate
must redefine theImplied
dummy type member and apply the aggregated annotations on it. Macro engines used inGenCodec
materialization and RPC framework will automatically pick up these annotations.In the above example, applying
@mongoId
annotation on theid
field has the same effect as if annotations@name("_id") @outOfOrder
were applied directly on that field.NOTE: thanks to the fact that aggregated annotations are applied on a type member you can pass the arguments of original annotation to aggregated annotations, e.g.