Java泛型,在方法调用期间定义类型

时间:2014-05-28 19:21:20

标签: java android generics casting type-conversion

我有两种静态方法:

  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 { ... }

1 个答案:

答案 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>>)