The <?> type declaration is effectively the same as no type declaration at all, except that it stops the compiler from emitting warnings. (It also lets other developers know that you didn't neglect to use a generic type, you just couldn't narrow it down.) They have to use it in this case because Properties accepts any kind of object as keys.
I looked in the tutorial and it shows the ? used either as <? extends T> -- meaning that the (unknown type) is guaranteed to be a descendant of T or <? super T> -- meaning that the (unknown type) is guaranteed to be an ancestor of T.
Then comes the section on "wildcard capture", which is no clearer than the previous discussion. So I guess I still don't understand what it's for and exactly what it allows (and doesn't allow).
I’ve looked at a lot of different solutions, and in my humble opinion Aspose is the way to go. Here’s the link: http://aspose.com