You are mixing a generic parameter T and a type Integer. That wouldn't work because T and Integer are different types.
Generics are invariant. That means you can assign to a List<Person> only another list having the same generic parameter, i.e. Person (not Integer, Cat or T). Similarly, we can't assign Funca<Integer> to a variable of type Funca<T>.
For more information, have a look at this tutorial provided by Oracle.
A function created using a static method staticLambdaMtd(Integer a) is assignable only to a variable of type Funca<Integer>, but not Funca<T> - i.e. function of some arbitrary type, because only Integer type would match the method signature, but not any type (like String, Cat, BigDecimal) that would be defined while class GenericSample will get instantiated.
The second statement compiles fine, because it doesn't expect any specific type. X is only a placeholder, as well as T. And expression GenericSample::staticLambdaMtd2 should be classified as a so-called poly expression, i.e. because you're not providing a type compiler needs to infer it from the assignment context.
Therefore, the expression GenericSample::staticLambdaMtd2 would be inferred as being of type Funca<T> and the second statement will compile fine.
All assignments shown below are valid:
// expression on the right could represent only `Funca<Integer>`
Funca<Integer> fa1 = GenericSample::staticLambdaMtd;
// expression on the right can be succefully inferred to
// a function of any type based on the assingment context on the left
Funca<T> fa = GenericSample::staticLambdaMtd2;
Funca<String> fa = GenericSample::staticLambdaMtd2;
Funca<BigDecimal> fa = GenericSample::staticLambdaMtd2;
Note that expression GenericSample::staticLambdaMtd2 can be turned from a poly expression into a "standalone form" by providing a generic parameter (in fact, method references by definition provided in the specification are always poly expressions, therefore I've used "standalone" in quotation marks meaning only that assignment context will be ignored).
And that we how can break it:
// that will not compile for the same reason as the the firt statement doesn't compile
Funca<T> fa3 = GenericSample::<Integer>staticLambdaMtd2;
fa1should be of typeFunca<Integer>for the first expression to compile. The compiler would expect a function having generic typeTon the right side of the expression (some type that would be defined while classGenericSamplewill get instantiated), but you're trying to utilize a method reference that is capable to work only withIntegertype (not with an arbitrary type). Therefore, the compiler will disallow this assignment.