编译器自动绑定(类型推断)泛型类型

2023-12-10

以下代码在 t3 行有编译错误:

public <E> List<E> getList()
{
    return new ArrayList<E>();
}
public <T> void first()
{
    List<T> ret = new ArrayList<T>();
    List<T> list = getList();
    T t1 = ret.get(0);
    T t2 = list.get(0);
    T t3 = getList().get(0);
}

错误信息是:类型不匹配:无法从 Object 转换为 T

我知道我可以使用强制转换或手动绑定来解决问题,我的问题是:编译器自动绑定这么难吗,有没有会失败的情况?

编辑:添加了错误消息。

编辑:添加了另一个如何不发生错误的示例。

编辑:删除了第二个示例,因为它令人困惑,使问题更加清晰。


在第一种情况下,您有两个带有类型参数的泛型方法,名为T,但是这些类型参数是不同的,所以让我们为它们分配不同的名称:

public <E> List<E> getList() { ... }
public <T> void first() { ... }

然后它的工作原理如下:

  1. 的一个元素List<T>(即类型的对象T) 被分配给类型的变量T,所以一切正常:

     List<T> ret = new ArrayList<T>();   
     T t1 = ret.get(0);
    
  2. 首先,一个类型的对象List<E>被分配给List<T>。该语句工作正常,因为类型参数E是从赋值左侧的类型推断出来的,所以T = E。然后它的工作方式与前面的情况一样:

     List<T> list = getList();          
     T t2 = list.get(0);
    
  3. 在这种情况下,您尝试分配类型的对象E到类型变量T, but E无法推断,因此假设为Object,因此赋值失败:

      T t3 = getList().get(0);         
    

    您可以通过绑定来修复此行为E to T手动:

      T t3 = this.<T>getList().get(0);
    

对于泛型类TestGenerics<T>你没有两个独立的类型参数,所以T两种方法都指同一类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译器自动绑定(类型推断)泛型类型 的相关文章

随机推荐

  • python中将edgelist导入igraph的格式

    igraph 接受的用于导入 python 的边缘列表格式是什么 包含加权边缘的文本文件应该是什么样子 我以前曾在 R 中使用过 igraph 但在我需要使用的机器上没有安装有效的 R 所以我陷入了 python 困境 我有一个 egeli
  • Python Matplotlib 滑块已绘制但不移动或更新

    我正在尝试绘制一个散点图 其中一个点根据滑块调整的参数移动 我需要参数是坐标列表中的位置 我拥有它 因此可以绘制散点图 并且我可以通过更改位置来手动移动点 但是当我尝试实现滑块时 它会显示 但无法更新绘图 任何帮助都会很棒 到目前为止我所拥
  • Catia VBA 到 .CATScript(针对“集合”类型)

    在我的 VBA 代码中 我使用以下内容 Dim docsToSave As Scripting Dictionary Set docsToSave New Scripting Dictionary Dim toRemove As Colle
  • Matlab 上 Z 归一化 (z-score) 函数的反函数

    在Matlab R2014a中我有信心使用z分数 x 功能 function z mu sigma zscore x flag dim if isequal x z return end if nargin lt 2 flag 0 end
  • 在 JPanel 上添加 .GIF 时显示黑色方块

    我的问题是 当将 GIF 添加到 JPanel 时 它会显示 GIF 的黑色方形背景 在JPanel上添加时的结果 当我使用这一行时会发生这种情况 p2 add loadBar where p2 new JPanel 但是 当我在 JFra
  • 在 swift 中使用简单 Ping (iOS)

    我正在尝试使用 Apple 的类 Simple Ping 但我无法使其正常工作 当我运行示例 mac os x 项目时 它正在工作 2015 06 17 00 03 22 569 SimplePing 20386 3133535 ping
  • Angular 5 插入动态输入属性

    我想将动态属性插入到输入 html 标记中 但我不知道该怎么做 我从组件端得到了这段代码 import Component OnInit from angular core Component selector app transclusi
  • Web 套接字在 Firefox 12 中不工作

    Firefox 无法与服务器 ws 192 168 0 155 5555 socket server3 php 建立连接 document ready function if WebSocket in window alert not av
  • 将 jQuery 自动完成与 Flask 结合使用

    这个问题之前已经被问过 我想我已经做了我在那里看到的事情 但我真的不知道我做错了什么 我对 jQuery 了解不多 但我会尽力解释我想要做什么 我想根据数据库中的查询自动完成 所以我的模板中有这样的内容
  • 张量流构建错误

    我在构建 Tensorflow 1 1 0 时遇到此错误 Starting local Bazel server and connecting to it ERROR home bishal cache bazel bazel bishal
  • ASP.NET Core 5 和 6 JWT 身份验证始终抛出 HTTP 401 代码

    我想在 ASP NET Core 中实现基于 JWT 的安全性 目前我想要它做的就是读取按钮中的令牌 Html ActionLink Test Oper Home 授权标头并根据我的标准验证它们 我不知道错过了什么 但它总是返回 HTTP
  • 将 prop 从子级传递给父级 React

    In WeatherForecast组件我需要传递函数的返回值appColor进入财产 那么该财产来自WeatherForecast需要传入className of app成分 新的反应 不确定如何将属性从子级传递到组件 class Wea
  • 在webview中加载本地javascript?

    我正在用我自己的广告快速制作移动浏览器 我想运行脚本 我已经注入了 javascript 本地文件 但它在其他窗口中打开并覆盖 webview 内容 是否可以在 webview 页面中运行 javascript 代码 不在其他窗口中 仅在包
  • 列出 knitr 环境(在 R 块中使用 list2env 时出现 R-markdown 错误)

    编辑 我发现问题源于yaml代码 它来自于应用这个解决方案动态命名文件 我相信它创造了一个家长环境knitr代码 因此list2env造成意想不到的行为 需要明确的是 下面的代码在 R 中完美运行 我在用list2env with envi
  • Camera2 API - Android

    我正在尝试使用android提供的新相机api作为camera2 但 CameraManager manager CameraManager getActivity getSystemService Context CAMERA SERVI
  • 检查 JavaScript 中属性是否存在

    我是 JavaScript 新手 对鸭子类型的概念有点困惑 据我所知 我理解了这个概念 但这在我的想法中导致了一个奇怪的结果 我将用下面的例子来解释 我目前正在使用 jQuery Mobile 开发移动 Web 应用程序 有一次我捕捉到了v
  • 使用 has_one 和 Belongs_to 的嵌套路由和 form_for 以及模型

    如何使用嵌套路由映射 has one 模型 以及如何在 RESTful 数据库之后为 localhost 3000 users 1 profile new html erb 添加 form for 用户拥有一份个人资料 Models cla
  • 使用相同的 php 文件显示表单并接收表单数据

    我有一个生成表单的 php 页面 表单的操作属性是页面本身 用户提交表单后 将加载相同的页面 但这次设置了 POST 变量 因此页面运行另一个脚本来处理来自表单的传入数据 我通过使用条件分叉来做到这一点 if isset POST var
  • 获取断点检索地址簿数据

    我正在检索phoneNumbers我得到一个断点 我花了几个小时试图修复它 但仍然没有成功 void textMessage ABAddressBookRef addressBook ABAddressBookCreate NSMutabl
  • 编译器自动绑定(类型推断)泛型类型

    以下代码在 t3 行有编译错误 public