【发布时间】:2026-01-25 04:45:01
【问题描述】:
我正在尝试制作一个简单的存储类,它将存储不同的类实例。我设法做到的唯一几乎正确的方法是使用未经检查的类型转换。
HashSet<T> result = (HashSet<T>) storage.get(s);
可以在不进行未经检查的强制转换和不使类通用 (class Storage<T> { }) 的情况下完成吗?
import java.util.*;
import org.junit.*;
class Tests {
@Test
public static void main (String[] args) {
Storage storage = new Storage();
HashSet<Child1> child1Set = storage.get("child1");
HashSet<Child1> duplicateChild1Set = storage.get("child1");
Assert.assertNotNull(child1Set);
Assert.assertSame(child1Set, duplicateChild1Set);
HashSet<Child2> child2Set = storage.get("child2");
Assert.assertNotNull(child2Set);
Assert.assertNotSame(child1Set, child2Set);
}
}
class Storage {
public Map<String, HashSet<? extends Parent>> storage = new HashMap<>();
public <T extends Parent> HashSet<T> get(String s) {
HashSet<T> result = (HashSet<T>) storage.get(s);
if (result == null) {
result = new HashSet<>();
storage.put(s, result);
}
return result;
}
}
class Parent { }
class Child1 extends Parent { }
class Child2 extends Parent { }
【问题讨论】:
-
未经检查的类型转换是安全的,您不必担心。你甚至可以压制是-
@SuppressWarnings("unchecked")。不幸的是,这就是您创建异构类型安全容器的方式。
标签: java generics types casting unchecked