Fabrizio Giudici posts a nice description of type-safe map keys, a clever way to simplify life for an API user.
It exposes one of the nuisances of class tokens:
@Nonnull public <T> T get (final @Nonnull Key<T> key) throws NotFoundException { return NotFoundException.throwWhenNull( (T)itemMap.get(key), "Not found: " + key); }
(Kudos to him for using JSR-305 annotations.)
See the cast (T)
? That generates a compile-time warning (link just one of many complaints around this). The correct way to get ride of this warning is to use a class token:
@Nonnull public <T> T get (final @Nonnull Key<T> key) throws NotFoundException { return NotFoundException.throwWhenNull( key.cast(itemMap.get(key)), "Not found: " + key); }
Where the Key<T>
type is redefined:
@Immutable public final static class Key<T> implements Comparable<Key<T>> { @Nonnull private final String name; @Nonnull private final Class<T> type; protected Key (final @Nonnull String name, final @Nonnull Class<T> type) { this.name = name; this.type = type; } public T cast(final Object that) { return type.cast(that); } @Override public int compareTo (final @Nonnull Key<T> other) { ... } @Override public boolean equals (final @CheckForNull Object object) { ... } @Override public int hashCode() { ... } }
What a nuisance.
No comments:
Post a Comment