On 03/13/2014 09:56 AM, Pavel Bucek wrote:
And then there is a Session object, which has method "void
addMessageHandler(MessageHandler handler);". Obvious common use of this
method is:
session.addMessageHandler(new MessageHandler.Whole<String>() {
@Override
public void onMessage(String message) {
// ...
}
});
I can see my IDE automatically offers me to transform this to lambda
expression (this is actually what worries me a little, because all users
will see that and do it - because why not - it seems to be equivalent
with anonymous class). When this suggestion is accepted, previous
statement is transformed into:
session.addMessageHandler((MessageHandler.Whole<String>) message -> {
// ...
});
which looks prettier, but just does not work and cannot work :/
Why doesn't it work? Does the implementation try to extract the String
actual type argument? Then it's unsound because
session.addMessageHandler(new MessageHandler.Whole<T>() {
@Override
public void onMessage(T message) {
// ...
}
});
type-checks (assuming that T is a type parameter), but will not work at
run time, either.
--
Florian Weimer / Red Hat Product Security Team