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

2024-01-17

下面是代码,

import java.util.List;
import java.util.ArrayList;


public class Dummy {
    public static void main(String[] args) {
        List<String> lst = new  ArrayList<String>();
        lst.add("a string");
        lst.add("another string");
        String s = lst.get(0);
    } //end main
}

当构造函数new ArrayList<String>();被调用,类型数组Object被建造。

enter image description here ..

lst holds Object[0] array.

所以,如果数组类型Object由构造函数创建,如何javac在此语句中没有看到类型转换问题String s = lst.get(0);,尽管在调用构造函数时使用了通用语法?


这是一些非通用代码:

public class MyList {

    List myData = new ArrayList();

    public void add(Object ob) {
        myData.add(ob);
    }

    public Object getAtIndex(int ix) {
        return myData.get(ix);
    }
}

此代码将允许您将任何类型的对象存储到 MyList 实例中even ifMyList 的契约指定对象必须全部属于同一类型。此外,如果您使用 MyList 实例来存储 String 实例,则在检索它们时必须手动将它们转换为 String。

String myString = (String) myList.get(1);

上面的 MyList 类不是类型安全的。如果将 String 实例以外的对象存储到 MyList 实例中(这可能在运行时发生,没有任何抱怨),则上述赋值语句很可能会失败并出现 ClassCastException。

这是一个泛化的 MyList 类:

public class MyList<T> {

    List<T> myData = new ArrayList<>();

    public void add(T ob) {
        myData.add(ob);
    }

    public T getAtIndex(int ix) {
        return myData.get(ix);
    }
}

现在,编译器保证只有T可以从 MyList 实例中添加和检索实例。因为编译器保证T实例将始终被返回,您可以使用这样的语法而无需任何手动转换:

String myString = myList.get(1);

泛化的 MyList 类现在是类型安全的。编译器不允许您存储除以下内容之外的任何内容T实例到 MyList 实例中,这保证了运行时不会发生 ClassCastExceptions。如果您检查字节码,您会发现编译器已自动进行强制转换。

Java 中的泛型是仅编译时现象。在字节码中,所有引用T上面的 MyList 类中的替换为Object。此过程称为“类型擦除”。请务必记住,Java 中的类型安全仅由编译器提供。如果你的程序编译没有任何错误AND如果没有任何警告,那么您的程序(包括泛型和所有内容)都是类型安全的。然而,编译后的程序几乎没有保留有关通用参数的信息。

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

java 泛型语法如何帮助避免类型转换? 的相关文章

  • 如何将log4j日志文件更改为utf8

    我收到了一个使用 log4j 作为记录器应用程序的代码 如何为其生成 UTF8 日志文件 log4j 创建的日志文件目前为 ASCII 格式 我已经尝试过以下操作 按照以下说明设置日志文件的文件编码 vi current set bomb
  • java字符串索引越界异常

    从类中调用函数时出现以下错误 java lang StringIndexOutOfBoundsException 字符串索引超出范围 1 尽管我使用系统打印来查看我在 substring 函数中传递的输入 但一切似乎都是正确的 函数 isC
  • while循环内的递归,它是如何工作的?

    你能告诉我这段java代码是如何工作的吗 public class Main public static void main String args Strangemethod 5 public static void Strangemet
  • 继续使用 sketch.js 编辑草图图像 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在使用 sketch js 中的示例 http intridea github io sketch js http intridea g
  • 如何使用 Java 本机接口将字节数组传递到以 char* 作为参数的 C 函数中?

    所以我需要使用JNI从java调用C函数 当传入不同的数据类型 创建本机变量 头文件 共享库等等 时 我已经能够成功地做到这一点 但无法让它与字节数组一起使用 这是我的 C 函数 include
  • CXF 客户端异常:{XXX} 的拦截器已引发异常,现在展开

    我遇到以下 CXF 异常 warning Interceptor for http example com wsdl esc 2011 12 12 AmazonEC2 http example com wsdl esc 2011 12 12
  • 使用Keycloak保护Tomcat应用程序时出现HTTP 403禁止错误

    我为这个错误苦苦挣扎了一整天 我一遍又一遍地检查我在tomcat中Keycloak和APP的配置 没有发现错误 下图为测试场景 APP配置 1 Keycloak json是从Keycloak控制台复制的 2 context xml 也正确
  • 如何将选定的项目移动到列表顶部

    List
  • Java GUI,根据actionListener更改面板

    我在两个不同的面板中添加了两个按钮 如果单击第一个按钮 则需要转到下一个面板 其中包含第二个按钮 但是当我单击第一个按钮时 该按钮没有被替换 Java GUI import java awt event ActionEvent import
  • 椭圆与椭圆如何相交?

    我用的是JAVA Ellipse2D s1 new Ellipse2D Float 0 0 100 100 System out println s1 intersects 99 30 100 100 应该返回 false 但它返回 tru
  • 如何跨工作区保存 E​​clipse 启动配置文件?

    当我复制 Eclipse 项目目录时 它包含 classpath 和 project 文件 这样当我将同一目录带到另一个 Eclipse 实例时 我不必设置我的构建路径等 假设所有资源都包含在在项目中 而不是外部 但是 此过程不会导致启动配
  • Java 会话变量

    我听说有些人认为在会话中将信息存储在服务器上是一个坏主意 因为它不安全 因此 在多页面业务流程功能中 应用程序将数据写入数据库 然后在需要时检索信息 在会话中存储私人信息是否一定不安全 只要会话本身安全 在会话中存储属性就不存在安全风险劫持
  • IntelliJ 对于 Java 项目使用的默认构建过程是什么?

    直接从 IntelliJ 中的 IDE 构建 Java 项目非常好 它速度很快 而且很有效 我无法找到任何有关 IntelliJ 如何进行这些默认构建的文档 我猜它使用Ant 我想做的是为下载我的项目的任何人自动化这个快速 轻松的构建过程
  • java代码的等效vb代码

    谁能告诉我这段Java代码到底做了什么 SecureRandom random SecureRandom getInstance SHA1PRNG byte bytes new byte 20 synchronized random ran
  • 使用 spring mvc 的多个域

    假设我有一个应用程序必须缩短 URL 但还要执行其他操作 喜欢google com and goo gl or facebook com and fb me 部署两个应用程序很容易 但 目前 仅部署一个应用程序更简单 使用 spring 和
  • 公交车公共交通算法

    我正在开发一个可以查找公交路线的离线 C 应用程序 我可以提取时间表 巴士 路线数据 我正在寻找适用于基本数据的最简单的解决方案 可以使用什么算法来查找从巴士站 A 到巴士站 B 的路线 是否有适用于 C Java 的开源解决方案 数据库的
  • 应返回带有 html 代码的字符串的支持 bean 属性返回空字符串

    我的支持 bean 中有一个返回 html 代码的属性 public String getHtmlPrevisualizar return Hello world 我想要做的是在 iframe 中显示这个 html 代码 我用 JavaSc
  • 如何删除 Spring 的 RestTemplate 添加的某些 HTTP 标头?

    我在远程服务方面遇到问题 我无法控制对使用 Spring 的 RestTemplate 发送的请求进行 HTTP 400 响应 使用发送的请求curl但被接受了 所以我将它们与通过 RestTemplate 发送的内容进行了比较 特别是 S
  • 如何在android中使用Room Persistence ORM工具实现created_at和updated_at列

    我该如何实施created at and updated at在Android中使用Room Persistence ORM工具的列 可以在创建或更新表中的行时自动更新时间戳 我研究了很多网站 但仍然没有找到任何可以处理的结果middlew
  • java有类似C#的属性吗? [复制]

    这个问题在这里已经有答案了 C 属性 我的意思是 get 和 set 方法 是一个非常有用的功能 java 也有类似 C 的属性吗 我的意思是我们如何在 java 中实现类似以下 C 代码的内容 public string Name get

随机推荐

  • 虚幻引擎 4 中的 C++ 嵌套 JSON

    我有一个从服务器获取的 JSON 对象 如下所示 state 1 player1 alias Player Name ready 0 我能够获取 JSON 将其解析为 FJsonObject 并使用以下代码检索 JSON 对象第一级中的任何
  • 使用多个 Getter 时用 Try-Catch 代替 Null 检查

    我的问题如下 我有一个很长的 Getter 即 objectA getObjectB getObjectC getObjectD getObjectE getName 由于 糟糕的 数据库 实体设计 有些东西比其他东西晚于其他东西引入 它发
  • 获取所选项目的详细信息

    我正在使用sap m ObjectListItem作为我已从 API 绑定 JSON 数据的列表项 但是 当我按下某个项目时 我找不到从列表中获取所选项目的方法 甚至获得该物品的钥匙也会有帮助
  • 用 unicode 分隔符分割字符串? [复制]

    这个问题在这里已经有答案了 给定字符串 str Led Zeppelin Blackdog 我该如何分割它 最终得到 Led Zeppelin Blackdog but 不是连字符 它被编码为u u2014 我该怎么做 如果您希望清楚地表明
  • 组合词频数据列表

    这似乎应该是一个显而易见的问题 但列表上的教程和文档尚未发布 其中许多问题源于我的文本文件的巨大大小 数百 MB 以及我试图将它们归结为我的系统可以管理的内容 因此 我正在分段进行工作 现在正在尝试合并结果 我有多个词频列表 大约 40 个
  • 如何从堆栈帧中获取泛型参数的类型?

    我们应该通过工厂实例化我们的实体 因为它们在客户端和服务器上的设置不同 我想确保情况确实如此 但无法完全使其发挥作用 public interface IEntityFactory TEntity Create
  • jQuery basic:当单击该行的按钮时,如何删除该行?

    tableid tbody last append html 这会动态创建表行 每个新创建的行都有一个 删除 按钮 现在 如果我单击删除按钮 该行将被删除 我怎样才能做到这一点 提前致谢 buttonSelector live click
  • C++ 编译器如何确保不同但相邻的内存位置可以安全地在不同线程上使用?

    可以说我有一个结构 struct Foo char a read and written to by thread 1 only char b read and written to by thread 2 only 现在据我了解 当两个线
  • R-paste() 函数中的新行[重复]

    这个问题在这里已经有答案了 使用函数时如何插入新行paste http stat ethz ch R manual R patched library base html paste html或者 R 中连接字符串的任何函数 关于这个主题有
  • Ollydbg 1.10“返回用户模式”不起作用

    我尝试学习 莉娜为新手倒车 https tuts4you com download php view 125 当出现一些麻烦时 我使用 ollyDbg 启动 Pixtopian Book 然后尝试使用 MessageBox 来显示有关未注册
  • 将 Apache LANG 更改为 en_GB.UTF-8

    我希望将 Apache 环境 LANG 从 C 更改为en GB UTF 8但找不到在哪里 里面 etc apache2 apache2 conf我添加了AddDefaultCharset UTF 8 基于此 https stackover
  • Java中的静态方法可以使用对象实例来访问[重复]

    这个问题在这里已经有答案了 在 Java 中 创建静态方法来访问它 而无需任何对象实例 这对我来说有一定道理 但最近我发现了一件奇怪的事情 Java中的静态方法也可以通过其对象实例来访问 这对我来说看起来很奇怪 大家知道为什么Java要提供
  • 电子,从浏览器窗口打印到PDF

    我了解电子中 printToPDF 的常用方法是在main调用以下代码的过程 const BrowserWindow require electron const fs require fs let win new BrowserWindo
  • ImageView 中心与 ScaleType Matrix 就位

    我正在使用 ImageView 的缩放效果 所以我需要使用scaletype matrix 现在 我想将中心位置设置为 ImageView 但我无法设置它 请帮助我解决这个问题 布局 xml
  • 找到三元组中间值的最快方法?

    给定的是一个由三个数值组成的数组 我想知道这三个数值的中间值 问题是 最快的方法是什么找到三者的中间点 我的方法是这种模式 因为有三个数字 所以有六种排列 if array randomIndexA gt array randomIndex
  • 使用 facebook 发表评论的按钮不起作用

    我正在尝试使用 Like Button 的 XFBML 实现 如Facebook 社交插件页面 http developers facebook com docs reference plugins like 出现 喜欢 按钮并且工作正常
  • 如何找出我的密钥存储在 Redis Cache/db 中的时间?

    是否有任何 redis 命令可以告诉 key 何时存储在 redis 中 我知道有TTL命令 根据时间的不同 我想采取不同的行动 就像如果 从最后 1 分钟开始 然后做 x 从最后 2 分钟开始 然后做 y ETC 没有这样的命令 但是 您
  • 将元素从容器中分离出来

    我将所有内容包装在具有固定宽度的容器元素中 但我有一个 div 我想 突破 该容器以跨越页面的整个宽度 http dabblet com gist 3207168 http dabblet com gist 3207168 正如您在该示例中
  • 如何为 Spinner 继承自 BaseAdapter 的 CustomAdapter 进行 Android 数据绑定?

    我在使用 Android DataBinding 和 BaseAdapter 为 Spinner 实现 CustomAdapter 时遇到问题 数据有两个值 我想使用两个 TextView CustomAdapter必须继承自BaseAda
  • java 泛型语法如何帮助避免类型转换?

    下面是代码 import java util List import java util ArrayList public class Dummy public static void main String args List