基于返回类型的Java泛型转换?

灰棚屋

以下代码来自一个名为ButterKnife的Android库。我正在弄清楚它是如何工作的。

@SuppressWarnings("unchecked") // That's the point.
  public <T> T castParam(Object value, String from, int fromPosition, String to, int toPosition) {
    try {
      return (T) value;
    } catch (ClassCastException e) {
      throw new IllegalStateException("Parameter #"
          + (fromPosition + 1)
          + " of method '"
          + from
          + "' was of the wrong type for parameter #"
          + (toPosition + 1)
          + " of method '"
          + to
          + "'. See cause for more info.", e);
    }
  }

我试图重新创建此函数的行为:

  @SuppressWarnings("unchecked")
    public static <T> T cast(Object o){
        try {
            return (T) o;
        } catch (ClassCastException e){
            throw new AssertionError("Error");
        }
    }

和用法:

Object o = new String("test");
Double d = cast(o);

但是异常并非永远不会被捕获,它在调用该方法时会抛出该行。这是为什么?

另外,这究竟如何工作?该方法如何知道要转换为什么?

正如SJuan67解释的那样,您不能真正使用泛型类型的强制类型转换,因为Java编译器会

如果类型参数不受限制,则将通用类型中的所有类型参数替换为其边界或对象。因此,产生的字节码仅包含普通的类,接口和方法。

有关所有仿制药限制的更多信息,请参见此处

因此,ButterKnife代码如下所示:

  public Object castParam(Object paramObject, String paramString1, int paramInt1, String paramString2, int paramInt2)
  {
    return paramObject;
  }

所以对你的问题:

问:但是并非永远不会捕获异常,在调用该方法时,它会抛出异常。这是为什么?

答:嗯,甚至没有在字节码中。

问:此外,这是如何工作的?该方法如何知道要转换为什么?

答:不是。至少不像您想的那样。在实践中,它将抛出ClassCastException,而不是您观察到的IllegalStateException或AssertionError。您甚至可以使用ButterKnife示例应用程序尝试将其绑定到CheckBox并将其与TextView绑定:

@Bind(R.id.title) CheckBox title;

问:图书馆如何工作?

答:好吧,永远不会调用IllegalStateException,并且您有ClassCastException。我不确定为什么会这样。但是,当ButterKnife生成代码时,这可能是为了防止编译错误。

例如:

public interface Some {
}

public static void weWantSome(Some d) {
}

public static void test() {
    String o = "test";
    weWantSome((Some)o); //<-- compile error
    weWantSome(Main.<Some>cast(o)); //<-- runtime error
} 

这就是为什么在前面的示例代码中编译但无法运行的原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

基于泛型的输入的窄返回类型

来自分类Dev

Java泛型类型转换

来自分类Dev

Java泛型返回类型

来自分类Dev

Java返回类型泛型

来自分类Dev

Java 泛型返回类型

来自分类Dev

Swift泛型:基于参数类型的返回类型

来自分类Dev

Java泛型和强制转换泛型类型

来自分类Dev

Java泛型:返回界泛型类型

来自分类Dev

通过Java泛型的动态返回类型

来自分类Dev

泛型类型的转换

来自分类Dev

转换泛型类型

来自分类Dev

基于Newexpression返回匿名类型的泛型类实例

来自分类Dev

如果不进行广泛的转换,则无法传递/返回 Class 的 Java 泛型子类型

来自分类Dev

返回泛型类型的泛型方法

来自分类Dev

Java泛型转换

来自分类Dev

为什么Java泛型不允许在泛型类型上进行类型转换?

来自分类Dev

构造/制作泛型类型并将类型约束转换为基于结构的类型约束

来自分类Dev

Swift泛型类型转换

来自分类Dev

泛型无法转换类型

来自分类Dev

转换泛型类型对象

来自分类Dev

类型转换为泛型

来自分类Dev

泛型返回类型 E

来自分类Dev

Java泛型并转换为原始类型

来自分类Dev

Java泛型。类型不匹配:无法从对象转换为

来自分类Dev

Java泛型。类型不匹配:无法从对象转换为

来自分类Dev

Java迭代器和泛型类型转换

来自分类Dev

Java泛型语法如何帮助避免类型转换?

来自分类Dev

如何在Java中将泛型转换为具体类型

来自分类Dev

Java,策略模式,泛型和返回类型