What's the reason for having getLong, getInteger, getBoolean, getBinary, etc and now getCurrentValueDictionaryID?

Do all the get* methods cast the underlying value when they return it?

Why not parameterize ColumnReader? To avoid autoboxing? It seems odd to have ColumnReader coupled with Dictionary-specific concepts.

What about making a sub-interface like DictionaryColumnReader which adds the getCurrentValueDictionaryID() method?