Java 为什么整数集容器填充字符串元素

Java 为什么整数集容器填充字符串元素,java,generics,lambda,java-8,Java,Generics,Lambda,Java 8,我有一个集合,它的泛型是集合。我从这个代码中得到它 Set<Integer> completeOrgTree = codeSetOfStores.stream().flatMap(item -> organizationDao.getUpstreamOrgByCode(item).stream()).collect(toSet()); 我的JDK版本是1.8.0131 ======================================================

我有一个集合,它的泛型是集合。我从这个代码中得到它

Set<Integer> completeOrgTree = codeSetOfStores.stream().flatMap(item -> organizationDao.getUpstreamOrgByCode(item).stream()).collect(toSet());
我的JDK版本是1.8.0131

========================================================================

我找到了答案。 让这一切发生的是mybatis。 在xml文件中,我有以下方法

<select id="getUpstreamOrgByCode" resultType="String">
        SELECT
            id,
            `CODE`
        FROM
            t_org_architecture
        WHERE
            LEFT (#{code}, LENGTH(`CODE`)) = `CODE`;
    </select>
<select id="getUpstreamOrgByCode" resultType="String">
        SELECT
            id,
            `CODE`
        FROM
            t_org_architecture
        WHERE
            LEFT (#{code}, LENGTH(`CODE`)) = `CODE`;
    </select>
此选择的结果类型为字符串。 在java文件中,我有相应的方法:

Set<Integer> getUpstreamOrgByCode(String code);
Set<Integer> getUpstreamOrgByCode(String code);
因此,mybatis将字符串值放入集合中,而不管该集合的类型是整数


我猜mybatis是通过java反射来实现这一点的

您是非具体化泛型的受害者。在运行时,完全可以将任何对象放入集合中,而不管其声明的泛型类型如何。泛型类型不会在运行时强制执行

下面是一个示例,我在列表中添加了3种不同的类型,当您尝试对其进行迭代时,这也会产生一个类强制转换异常

List<Integer> intList = new ArrayList<>();
List anyList = intList;
anyList.add(1);
anyList.add(new Object());
anyList.add("test");

intList.stream().forEach(item -> System.out.println(item));
所以我想,无论是谁负责填充这个场景,都会在某个地方搞砸。理想情况下,您应该在源代码处修复它

如果这是不可能的,那么就把它放到一个集合中,因为我们知道它是真的,无论出于什么原因

List<Object> objList = (List<Object>) (List) intList;
objList.stream().forEach(item -> System.out.println(item));
如果您想做比打印每个项目更复杂的事情,可能需要检查instanceof类型,然后为字符串和整数添加一些条件逻辑。

我找到了答案。 让这一切发生的是mybatis。 在xml文件中,我有以下方法

<select id="getUpstreamOrgByCode" resultType="String">
        SELECT
            id,
            `CODE`
        FROM
            t_org_architecture
        WHERE
            LEFT (#{code}, LENGTH(`CODE`)) = `CODE`;
    </select>
<select id="getUpstreamOrgByCode" resultType="String">
        SELECT
            id,
            `CODE`
        FROM
            t_org_architecture
        WHERE
            LEFT (#{code}, LENGTH(`CODE`)) = `CODE`;
    </select>
此选择的结果类型为字符串。 在java文件中,我有相应的方法:

Set<Integer> getUpstreamOrgByCode(String code);
Set<Integer> getUpstreamOrgByCode(String code);
因此,mybatis将字符串值放入集合中,而不管该集合的类型是整数


我猜mybatis是通过java反射来实现的

你能显示ClassCastException的完整堆栈跟踪吗?你getSystem.out.println不会强制转换它的参数…@AndrewTobilko不,但lambda会。这是一个Consumer@Michael不管流包含什么,.forEachitem->System.out.printlnitem都适合它,ClassCastException在哪里?GetUpstreamMorgbycode在做什么。它声称返回一组整数,但您验证过它是否真的返回了吗?当你在你的收藏中找不到你想要的东西时。。。那最好检查一下你放了什么进去。编译器很容易被欺骗或被迫忽略将错误的东西放入一个集合。答案正如你所说的。mybatis做到了这一点happen@Zero.zheng很酷,很高兴你把它分类了看看为什么你的问题质量不高?没有人会发现你有一个xml文件,并且存在一个问题:@AndrewTobilko抱歉,这是我第一次在这里提问。下次我会遵守规则。谢谢你,不需要反射,只需不检查强制类型转换和忽略警告就可以做到这一点。请看@Zero.zheng中的代码,没关系,别担心。下次做得更好@CarlosHeuberger不正确``Set intSet=new HashSet;intSet.addzero.zheng//您不能编译此文件```