gpt4 book ai didi

Java 通用转换错误

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

我在 java 中遇到了一个我不明白的问题,有人可以向我解释一下这种奇怪的行为吗?

我的代码:

package com.test;

import junit.framework.TestCase;

public class MyTest extends TestCase{

class Container<I, J extends I> {
protected J data;

public J getData() {
return data;
}

@SuppressWarnings("unchecked")
public void setData(I data) {
try {
this.data = (J) data;
} catch (ClassCastException e) {
System.err.println("Cast" + e);
}
}
}

class A {
public String a = "A";
}

class B extends A {
public String B = "B";
}

class C extends A {
public String C = "C";
}

public void test1() throws Exception{
Container<A, B> container = new Container<>();
container.setData(new C());
assertNull(container.getData());
}
}

我预计此测试会通过,但出现以下错误:

junit.framework.AssertionFailedError: Expected: <null> but was: com.test.MyTest$C@5c228bbd
at junit.framework.Assert.fail(Assert.java:57)
at junit.framework.Assert.assertTrue(Assert.java:22)
at junit.framework.Assert.assertNull(Assert.java:277)
at junit.framework.Assert.assertNull(Assert.java:268)
at junit.framework.TestCase.assertNull(TestCase.java:438)
at com.test.MyTest.test1(MyTest.java:39)

容器怎么可能把C类装进B类呢?

此外,如果我尝试从数据中获取 B 值,则会出现 ClassCastException...

public void test1() throws Exception{
Container<A, B> container = new Container<>();
container.setData(new C());
System.out.println(container.getData().B);
}

执行该测试会出现以下错误:

java.lang.ClassCastException: com.test.MyTest$C cannot be cast to com.test.MyTest$B
at com.test.MyTest.test1(MyTest.java:39)

最佳答案

您不应该抑制编译时警告,否则您不会对代码具有奇怪的运行时行为感到惊讶。由于类型删除,您在 setData 中的转换未被选中,这意味着它永远不会失败。如果您希望传递 J,只需在签名中使用 J 而不是 I 即可。编译时将保证类型一致性。

顺便说一句,assertNull 不是测试此行为的正确方法。您应该让 ClassCastException 传播并使用 JUnit 注释:

@Test(expected = ClassCastException.class)
public void test1() {
Container<A, B> container = new Container<>();
container.setData(new C());
}

关于Java 通用转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32995092/

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