Invocation of a raw Consumer (without a generic type) always results in a warning. You simply should not do that as you do not know the type. Raw types do not have a type. That didn't change with Java 8.
The interface Consumer has a generic type but you do not know that at runtime. Even not for lambdas. Some classes might actually have the information, but that wont help you.
If you actually need to know the type then simply create such an interface.
@FunctionalInterface
public static interface StringConsumer {
void consume(String s);
}
public static void main(String[] args) throws Throwable {
StringConsumer sc = System.out::println;
sc.consume("Hello");
Method m = StringConsumer.class.getMethods()[0]; // only one: "consume"
m.invoke(sc, m.getParameters()[0].getType().getSimpleName());
}
Here's some example code and output to see what methods there are and how they can and can not ne invoked:
package com.example.foo;
import static java.util.Arrays.asList;
import java.lang.reflect.Method;
import java.util.function.Consumer;
public class SomeClass {
@FunctionalInterface
static interface FI {
public void m(String s);
}
static final class MyRegularClass {
@SuppressWarnings("static-method")
public void m(String s) {
System.out.println("MyRegularClass: " + s);
};
}
static final class MyGenericClass<T> {
public void m(T s) {
System.out.println("MyGenericClass: " + s);
};
}
public static void main(String[] args) throws Exception {
Consumer<String> c1 = (s) -> {
System.out.println("Lambda: " + s);
};
Consumer<String> c2 = new Consumer<String>() {
public void accept(String s) {
System.out.println("Anonym: " + s);
}
};
Consumer<String> c3 = new MyRegularClass()::m;
Consumer<String> c4 = new MyGenericClass<String>()::m;
for (Consumer<String> c : asList(c1, c2, c3, c4)) {
c.accept("regular invocation of accept(String)");
for (Method m : c.getClass().getDeclaredMethods()) {
String n = m.getName() + "(" + m.getParameters()[0].getType().getSimpleName() + ")";
try {
m.invoke(c, n);
} catch (Exception e) {
System.out.println("Did not accept String: " + n + " => " + e);
}
try {
m.setAccessible(true);
m.invoke(c, new StringBuilder("StringBuilder of ").append(n));
} catch (Exception e) {
System.out.println("Did not accept StringBuilder: " + n + " => " + e);
}
}
System.out.println("-----");
}
}
}
/* ==========================================
Output:
Lambda: regular invocation of accept(String)
Lambda: accept(Object)
Did not accept StringBuilder: accept(Object) => java.lang.reflect.InvocationTargetException
-----
Anonym: regular invocation of accept(String)
Anonym: accept(String)
Did not accept StringBuilder: accept(String) => java.lang.IllegalArgumentException: argument type mismatch
Anonym: accept(Object)
Did not accept StringBuilder: accept(Object) => java.lang.reflect.InvocationTargetException
-----
MyRegularClass: regular invocation of accept(String)
MyRegularClass: accept(Object)
Did not accept StringBuilder: accept(Object) => java.lang.reflect.InvocationTargetException
Did not accept String: get$Lambda(MyRegularClass) => java.lang.IllegalAccessException: Class com.example.foo.SomeClass can not access a member of class com.example.foo.SomeClass$$Lambda$2/1175962212 with modifiers "private static"
Did not accept StringBuilder: get$Lambda(MyRegularClass) => java.lang.IllegalArgumentException: argument type mismatch
-----
MyGenericClass: regular invocation of accept(String)
MyGenericClass: accept(Object)
Did not accept StringBuilder: accept(Object) => java.lang.reflect.InvocationTargetException
Did not accept String: get$Lambda(MyGenericClass) => java.lang.IllegalAccessException: Class com.example.foo.SomeClass can not access a member of class com.example.foo.SomeClass$$Lambda$3/617901222 with modifiers "private static"
Did not accept StringBuilder: get$Lambda(MyGenericClass) => java.lang.IllegalArgumentException: argument type mismatch
-----
*/