[cdi-dev] Type variable check for Event.select() and Event.fire()
Martin Kouba
mkouba at redhat.com
Tue Feb 23 03:14:46 EST 2016
Hi all,
I'd like to discuss the following two sentences taken from "10.2.1. The
Event interface").
1. Event.select()
"If the specified type contains a type variable, an
IllegalArgumentException is thrown."
So what should happen if you pass a raw type like List.class? The
Class.getTypeParameters() method returns [E]. Does it mean the type
contains a type variable? And what about "event.select(new
TypeLiteral<List<?>>() {})"?
2. Event.fire()
"If the runtime type of the event object contains an unresolvable type
variable, an IllegalArgumentException is thrown."
To my understanding:
1. the runtime type = eventPayload.getClass()
2. get type variables = getTypeParameters()
3. unresolvable = it's not possible to resolve the variable, nor from
the Event injetion point nor from the selected type (Event.select()),
anything else?
3. Example snippet
Should the following snippet fail or not? It currently fails in Weld
during event.select(). But even if we relax the check it will not be
always possible to resolve all the type variables, i.e. the subsequent
{{fire()}} invocation might fail. Or am I missing anything?
@Inject
Event<Object> event;
public void testSelectSubtypeWithWildcard() {
List<String> updatedList = new ArrayList<>();
updatedList.add("foo");
Event<List<?>> child = event.select(new TypeLiteral<List<?>>() {});
child.fire(updatedList);
}
Thanks,
Martin
More information about the cdi-dev
mailing list