首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >推断错误类型的类型的HashSet

推断错误类型的类型的HashSet
EN

Stack Overflow用户
提问于 2013-01-25 04:31:40
回答 3查看 541关注 0票数 4

可能重复: .contains( Long.valueOf( someLongValue ))

请看屏幕截图中的问题:

在类型化的集合中,cylinderIds中的条目似乎突然变成了String类型--但是这是如何发生的呢?

bean是在JSF页面中使用的,但是我一直认为Java中的类型系统应该防止这种情况.知道这里出了什么问题吗?

在Windows7上使用1.7.0_06 64位,应用程序在同一个JBoss版本的JBoss 7.1.0中运行。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-25 06:10:48

这并不完全是Java的错。泛型类型信息只是在运行时丢失。Java/JSF/EL不是在编译时运行,而是在运行时运行。它在运行时看到的只是一个Set,而不是一个Set<Long>

当JSF将提交的输入值设置为bean属性时,它首先以String的形式检索输入值,因为这是request.getParameter()的默认返回类型,JSF在幕后使用该类型获取请求参数。只要没有指定转换器,JSF就会通过反射设置未在Set中转换的提交的Set值。这基本上就是“幕后”所发生的事情:

代码语言:javascript
运行
AI代码解释
复制
package com.stackoverflow.q14521882;

import java.lang.reflect.Field;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

public class Test {

    private Set<Long> set = new HashSet<Long>();

    public static void main(String[] args) throws Exception {
        Test test = new Test();
        Field field = test.getClass().getDeclaredField("set");
        Object object = field.get(test);
        if (object instanceof Collection) {
            ((Collection) object).add("string");
        }
        System.out.println(test.set.iterator().next().getClass()); // CCE!
    }

}

当您使用Long[]而不是Set<Long>时,它会工作,但是考虑到它首先是一个Set,您希望只保存唯一的值,因此Long[]可能不是一个选项。为了解决这个问题,您需要在输入组件中显式指定一个Converter。您可以为此使用JSF内置的LongConverter,它的转换器ID为javax.faces.Long

代码语言:javascript
运行
AI代码解释
复制
<h:selectManyListbox ... converter="javax.faces.Long">
票数 2
EN

Stack Overflow用户

发布于 2013-01-25 04:38:25

第一个问题是,每次进入Iterator时都会请求一个新的while。第二个问题是Iterator是通用的,所以最好这样做:

代码语言:javascript
运行
AI代码解释
复制
Iterator<Long> cylinderIter = cylinderIds.iterator();

while(cylinderIter.hasNext()) {
    cylinderIter.next() // ...
    // do something
}

第三个问题是,我看不出您在哪里填充该Set。如果你给我们看密码我可以帮你更多。

票数 1
EN

Stack Overflow用户

发布于 2013-01-25 04:44:39

如果没有看到您的代码,我可以回答您的集合的类型正在发生变化:

泛型是通过类型擦除实现的:泛型类型信息仅在编译时出现,然后由编译器删除。这种方法的主要优点是它提供了使用非参数化类型(在技术上称为原始类型)的泛型代码和遗留代码之间的完全互操作性。的主要缺点是在运行时无法获得参数类型信息,并且当与行为不正常的遗留代码进行互操作时,自动生成的转换可能会失败。然而,有一种方法可以保证通用集合的运行时类型安全,即使与行为不佳的遗留代码进行互操作。

oracle文档的仿制药文章更好地解释了您。

试试下面的代码,看看问题何时发生:

代码语言:javascript
运行
AI代码解释
复制
Set<Long> s = Collections.checkedSet(new HashSet<Long>(), Long.class);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14521882

复制
相关文章
Kubernetes集群网络揭秘,以GKE集群为例
毛艳清,富士康工业互联网科技服务事业群运维中心主管,现负责公有云和私有云的运维工作,聚焦在云计算和云原生领域,主要关注企业迁云的策略与业务价值、云计算解决方案、云计算实施与运维管理,以及云原生技术的布道和落地实践。
灵雀云
2020/12/15
4.2K1
kubernetes helm安装pulsar集群
下载Pulsar Chart 首先,您需要下载Pulsar Chart,它是一个包含了Pulsar集群的Kubernetes资源定义文件的压缩包。您可以从Pulsar官网下载最新版本的Pulsar Chart。
堕落飞鸟
2023/03/28
1.3K0
如何使用Helm软件包管理器在Kubernetes集群上安装软件
Helm是Kubernetes的软件包管理器,允许开发人员和操作员更轻松地在Kubernetes集群上配置和部署应用程序。
姚啊姚
2018/10/29
2.1K0
Helm 编排教程
我们知道 Kubernetes 是一个分布式的容器集群管理系统,它把集群中的管理资源抽象化成一个个 API 对象,并且推荐使用声明式的方式创建,修改,删除这些对象,每个 API 对象都通过一个 yaml 格式或者 json 格式的文本来声明。这带来的一个问题就是这些 API 对象声明文本的管理成本,每当我需要创建一个应用,都需要去编写一堆这样的声明文件。
Ewdager
2020/08/06
2.8K0
Running Solr on Kubernetes
我们将为搜索工程师介绍在Kubernetes(k8s)上运行Solr的基础知识。 具体来说,我们涵盖以下主题:
黎明你好
2020/02/05
6.3K0
Running Solr on Kubernetes
Kubernetes 部署 Kafka 集群 「Helm 部署案例」
本项目完全兼容 KRaft, 不依赖 ZooKeeper,最小化的 Kafka 集群仅启动一个 Pod 即可。
sir5kong
2023/05/23
6K0
kubernetes-使用Helm安装Zookeeper集群
在Kubernetes中,使用Helm安装Zookeeper集群是一个非常方便的过程。Zookeeper是一个分布式的协调服务,用于协调集群中的应用程序。
玖叁叁
2023/05/04
1.4K0
kubernetes-使用helm创建Redis集群
Kubernetes是一个开源的容器编排系统,可以用于管理和部署容器化的应用程序。而Helm则是一个Kubernetes的包管理工具,可以方便地安装、升级和管理Kubernetes的应用程序。
玖叁叁
2023/05/04
1.8K0
Helm 构建 Kubernetes 软件包最佳管理工具
Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一样,能快速查找、下载和安装、升级软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成, 能够将一组K8S资源打包统一管理, 是查找、共享和使用为Kubernetes构建的软件的最佳方式。
MySQL轻松学
2020/12/28
6490
Helm 构建 Kubernetes 软件包最佳管理工具
Kubernetes 安装 Helm 并使用 Helm 安装 wordpress
chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包。
tanmx
2019/12/30
3.2K0
Kubernetes 安装 Helm 并使用 Helm 安装 wordpress
使用 helm 部署 k8s 资源
helm 是基于 kubernetes 的包管理器。它之于 kubernetes 就如 yum 之于 centos,pip 之于 python,npm 之于 javascript
jwangkun
2021/12/23
1.1K0
Kubernetes 集群中使用 Helm 搭建 Spinnaker 平台
上一篇文章 初试 Netflix 开源持续云交付平台 Spinnaker 中,我安装的是 Development Spinnaker,安装过程比较繁琐,而且没有跟 Kubernetes 集群集成起来,只能演示其部署管理功能中的 Pipeline 功能,而 Spinnaker 的另一个核心内容集群管理功能没法操作。本次我将实际操作演示如何在 Kubernetes 集群中安装 Spinnaker,后续演示如何使用 Spinnaker 执行 deploy 和 scale 一个应用到 Kubernetes 集群中。本次演示环境,我是在本机 MAC OS 上操作,以下是安装的软件及版本:
菲宇
2019/06/12
2.6K0
Kubernetes 集群中使用 Helm 搭建 Spinnaker 平台
​Kubernetes 集群仓库 harbor Helm3 部署
Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源 Docker Distribution。作为一个企业级私有 Registry 服务器,Harbor 提供了更好的性能和安全。提升用户使用 Registry 构建和运行环境传输镜像的效率。
高楼Zee
2020/11/30
8.2K1
​Kubernetes 集群仓库 harbor Helm3 部署
k8s 部署利器 helm v3 安装及使用指南
helm 是基于 kubernetes 的包管理器。它之于 kubernetes 就如 yum 之于 centos,pip 之于 python,npm 之于 javascript。
山月
2020/06/18
3.5K0
通过Kyverno使用KMS、Cosign和工作负载身份验证容器镜像
随着软件供应链攻击的增加,保护我们的软件供应链变得更加重要。此外,在过去几年中,容器的采用也有所增加。有鉴于此,对容器镜像进行签名以帮助防止供应链攻击的需求日益增长。此外,我们今天使用的大多数容器,即使我们在生产环境中使用它们,也容易受到供应链攻击。在传统的 CI/CD 工作流中,我们构建镜像并将其推入注册中心。供应链安全的一个重要部分是我们构建的镜像的完整性,这意味着我们必须确保我们构建的镜像没有被篡改,这意味着保证我们从注册中心中提取的镜像与我们将要部署到生产系统中的镜像相同。证明镜像没有被篡改的最简单和最好的方法之一(多亏了 Sigstore)是在构建之后立即签名,并在允许它们部署到生产系统之前验证它。这就是 Cosign 和 Kyverno 发挥作用的地方。
CNCF
2022/04/19
5K0
Kubernetes 中的渐进式交付:蓝绿部署和金丝雀部署
渐进式交付是持续交付的下一步, 它将新版本部署到用户的一个子集,并在将其滚动到全部用户之前对其正确性和性能进行评估, 如果不匹配某些关键指标,则进行回滚。
LinuxSuRen
2019/05/10
1.5K0
Kubernetes 中的渐进式交付:蓝绿部署和金丝雀部署
初试 Kubernetes 集群中使用 Helm 搭建 Spinnaker 平台
上一篇文章 初试 Netflix 开源持续云交付平台 Spinnaker 中,我安装的是 Development Spinnaker,安装过程比较繁琐,而且没有跟 Kubernetes 集群集成起来,只能演示其部署管理功能中的 Pipeline 功能,而 Spinnaker 的另一个核心内容集群管理功能没法操作。本次我将实际操作演示如何在 Kubernetes 集群中安装 Spinnaker,后续演示如何使用 Spinnaker 执行 deploy 和 scale 一个应用到 Kubernetes 集群中。本次演示环境,我是在本机 MAC OS 上操作,以下是安装的软件及版本:
哎_小羊
2019/05/25
2.1K0
Kubernetes Helm3 部署 ElasticSearch & Kibana 7 集群
ElasticSearch 安装有最低安装要求,如果执行 Helm 安装命令后 Pod 无法正常启动,请检查是否符合最低要求的配置。
高楼Zee
2020/11/30
4.5K2
Kubernetes Helm3 部署 ElasticSearch & Kibana 7 集群
053.Kubernetes集群管理-Helm部署及使用
Helm 是 Kubernetes 的软件包管理工具。包管理器类似 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一样,能快速查找、下载和安装软件包。通常每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tgz格式的单一文件,方便传输和存储)。
木二
2020/05/19
1.3K0
Kubernetes 集群使用 Helm 搭建 GitLab 并配置 Ingress
通过之前的文章 初试 Kubernetes 集群中使用 Helm 搭建 Spinnaker 平台 ,我们已经演示了如何通过 Helm 安装 Spinnaker 平台到本地 Kubernetes 集群中。本次演示环境,我依旧是在本机 MAC OS 上操作,以下是安装的软件及版本:
哎_小羊
2019/05/25
6K0

相似问题

已选择Livewire选择字段

12

Safari选择下拉显示空字段

11

文本字段保持为空

11

即使字段设置为空,也不能将字段保持为空

21

当选择框选项为no时,如何动态保持输入字段为空?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文