[string-templates] Covariant signature of 'process' method
Tagir Valeev
amaembo at gmail.com
Thu Aug 3 10:07:24 UTC 2023
Hello!
It's possible to create a custom string template with covariant
process() method signature. For example, we can relax the throws
statement:
public class Test {
static class MyProcessor<T> implements
StringTemplate.Processor<Integer, Exception> {
@Override
public Integer process(StringTemplate stringTemplate) {
return 123;
}
}
public static void main(String[] args) {
MyProcessor<String> proc = new MyProcessor<>();
Integer i = proc."hello";
}
}
Now, it's not compilable:
java: unreported exception java.lang.Exception; must be caught or
declared to be thrown
However, it's evident and can be statically checked that the exception
is not possible.
Covariant return type is also possible:
public class Test {
static class MyProcessor implements
StringTemplate.Processor<Integer, Exception> {
@Override
public Integer process(StringTemplate stringTemplate) {
return 123;
}
}
public static void main(String[] args) {
MyProcessor proc = new MyProcessor();
Integer i = proc."hello";
}
}
Now, it's not compilable:
java: incompatible types: java.lang.Object cannot be converted to
java.lang.Integer
This requires passing exact types through the inheritance hierarchy
which might be inflexible and annoying. I may probably want to declare
`abstract class AbstractProcessor implements Processor<Object,
Throwable>` and have any covariant signatures in subtypes without
declaring new type parameters and forward them through the hierarchy.
Java has another implicit way to call methods: try-with-resources and
AutoCloseable interface. There we have no exception type parameter,
but covariant signatures in subclass close() methods are respected at
the try-with-resource use sites. Probably it would be more consistent
and convenient to respect covariant signatures in string templates as
well?
With best regards,
Tagir Valeev.
More information about the amber-spec-experts
mailing list