gpt4 book ai didi

java - 转换后在一组整数中找到一个字符串

转载 作者:行者123 更新时间:2023-12-02 10:53:14 24 4
gpt4 key购买 nike

今天我注意到这种奇怪的行为:

public static void main(String[] args) {
Set<Integer> mySetA = get(Arrays.asList("1"));
test(mySetA);
}

private static <T> Set<T> get(Object b) {
Set<T> a = new HashSet<T>(cast(b));
return a;
}

public static <T> T cast(Object object) {
return (T) object;
}

private static void test(Set<Integer> test) {
test.stream().forEach(n -> System.out.println(n));
}

当我使用调试器查看 mySetA 的内容时,我发现它包含一个字符串“1”,即使 mySetA 应该是一个整数集。当我运行以下代码时,出现异常:

java.lang.String cannot be cast to java.lang.Integer

谁能解释一下为什么会发生这种情况?

更清楚地说:我不是在寻找“修复”。我想了解为什么我的代码可以编译,但这样的代码却不能编译:

public static void main(String[] args) {
Set<Integer> mySetA = get(Arrays.asList("1"));
test(mySetA);
}

private static <T> Set<T> get(Object b) {
Set<T> a = new HashSet<T>((T) b);
return a;
}

private static void test(Set<Integer> test) {
test.stream().forEach(n -> System.out.println(n));
}

谢谢

最佳答案

public static void main(String[] args) {
Set<Integer> mySetA = get(Arrays.asList("1"));
// test(mySetA);
}

private static <T> Set<T> get(Object b) {
Set<T> a = new HashSet<T>(cast(b));
return a;
}

public static <T> T cast(Object object) {
return (T) object;
}

让我们去掉中间人,只显示您正在使用的类型。首先,您创建一个字符串列表。那是List<String> 。然后你将其转换到 Object当你将它传递给get时。你拿那个Object (实际上是一个字符串列表)并转换为 Collection<Integer>对于HashSet构造函数。所以你正在采取 List<String>并转换通过 Object 。我们可以对整个 Java 语言中的任意两种类型执行此操作。给我任意两门课,比如FooBar 。我可以做

Foo a = new Foo();
Object b = (Object)a;
Bar c = (Bar)b;

编译器不会再考虑一下:没有错误。在运行时,这显然会失败,但这只是因为我们进行了不安全的转换。你也在做同样的事情;你只是将它隐藏在几个辅助函数后面。一般来说,转换为 Object是一种代码味道,并且从 Object 进行未经检查的转换远离绝对是一个危险信号。

如果 Java 不允许我们在不进行检查的情况下进行不安全的强制转换,那该多好?是的,会的。但事实并非如此。

关于java - 转换后在一组整数中找到一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51996360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com