Well, first of all, it makes no sense to declare a Some generic class unless you actually use a parameter of a certain type. And this is actually a source of problems. You instantiate a member field of this type in this fasion:
private final Some some = new Some();
This raw type declaration is a generic type in which type parameters are not specified. This actually means not only that its own type parameter T discarded, but all common types used in these methods of the class are ignored, including the <String> parameter in the public List<String> getSomeStrings() .
So the solution is actually simple, quoting Joshua Bloch:
Do not use source types in new code.
To make this specific, the fix you suggested is:
private final Some<?> some = new Some();
fixes the problem, but actually generates a compiler warning (unverified operation). A clean way would be to either declare the actual type parameter on the right side of the instruction, for example:
private final Some<String> some = new Some<String>();
The type that you put in the generic parameter can be any type you want, depending on how you intend to use the Some class. But if you really don't need a type parameter, just delete it and the code will work fine:
class Some { ... }
Note: there is no need to explicitly declare a String parameter in this code:
return Collections.<String> emptyList();
The compiler infers the generic type from the method signature, so you can simplify the code:
public List<String> getSomeStrings() { return Collections.emptyList(); }
Edit : Speaking of Joshua Bloch, there is a good Java puzzle regarding this factual issue in his talk on Google I / O 2011 at: http://www.youtube.com/watch?v=wbp-3BJWsU8&t=36m04s