我有两种静态方法:
public static Selector<TextView, Property<String>> textView(
final Selector<TextView, Property<TextView>> selector) {
return null;
}
public static <V extends View> Selector<V, Property<V>> withId(final int id) {
return null;
}
为什么Java编译器在调用期间无法解析所需的参数类型?
textView(withId(R.id.et_password));
但很容易接受这个:
Selector<TextView, Property<TextView>> p;
textView((p = withId(R.id.et_password));
任何人都可以提示我如何欺骗编译器?
P.S。 class TextView extends View { ... }
答案 0 :(得分:2)
您需要为此案例提供显式类型参数。语法是:
textView(MainActivity.<TextView>withId(R.id.et_password));
假设MainActivity
是具有这些方法的类(即使这个代码在类中,也不能省略它)。
如果withId
是实例方法而不是静态方法,那么它将是:
textView(this.<TextView>withId(R.id.et_password));
您可以查看this answer以获得有关原因的详细说明。这种特殊情况的不同之处在于<V extends View> Selector<V, Property<V>>
的删除是Selector<View, Property<View>>
(而不是<Object>
,因为已知V
扩展View
)。
正如您所看到的,这正是编译器显示的错误:
方法
textView(Selector<TextView,Property<TextView>>)
不适用于参数(Selector<View,Property<View>>)