假設(shè)有一個(gè)泛型接口Callback和一個(gè)JavaBean類:
public class JavaBean {
public String name;
}
public interface Callback<T> {
void onSucess(T t);
}
再來(lái)一個(gè)測(cè)試方法test()用于獲取參數(shù)callback的泛型類型
class TestDemo {
private <T> void test(Callback<T> callback) {
Type type = getTypeFromInterface(callback);
if (type != null) {
System.out.println(type.getTypeName());
} else {
System.out.println("未指定泛型");
}
}
private <T> Type getTypeFromInterface(Callback<T> callBack) {
try {
Type[] interfaceTypes = callBack.getClass().getGenericInterfaces();
Type type;
if (interfaceTypes.length == 0) {
//非接口
type = callBack.getClass().getGenericSuperclass();
} else {
type = interfaceTypes[0];
}
if (type == null) {
return null;
}
if (ParameterizedType.class.isAssignableFrom(type.getClass())) {
return (((ParameterizedType) type).getActualTypeArguments())[0];
}
} catch (Exception e) {
return null;
}
return null;
}
}
正常調(diào)用test方法,是用匿名內(nèi)部類的方式:
public static void main(String[] args) {
TestDemo demo = new TestDemo();
// 匿名內(nèi)部類
demo.test(new Callback<String>() {
@Override
public void onSucess(String o) {
}
});
demo.test(new Callback<JavaBean>() {
@Override
public void onSucess(JavaBean o) {
}
});
demo.test(new Callback<List<JavaBean>>() {
@Override
public void onSucess(List<JavaBean> o) {
}
});
}
運(yùn)行查看輸出如下:
java.lang.String
***.***.JavaBean
java.util.List<***.***.JavaBean>
說(shuō)明這樣能夠獲取泛型類型。但是這種匿名內(nèi)部類的方式開(kāi)發(fā)工具會(huì)提示用lambda代替。
public static void main(String[] args) {
TestDemo demo = new TestDemo();
// lambda表達(dá)式
demo.test((Callback<String>) s -> {
});
demo.test((Callback<JavaBean>) s -> {
});
demo.test((Callback<List<JavaBean>>) s -> {
});
}
然后再運(yùn)行下,查看輸出,居然獲取不到泛型類型?。?!
未指定泛型
未指定泛型
未指定泛型
請(qǐng)問(wèn)各位大佬,這是為什么呢?如果想用lambda表達(dá)式那要怎么獲取接口的泛型類型呢?