java使用接口类<T>作为键来获取具体的实例值?
我有一个无法从Map
中检索值的测试用例:
package tests;
import java.util.HashMap;
import java.util.Map;
public class ClassTest {
interface A {}
interface B extends A {}
interface C extends A {}
class D implements B {}
class E implements C {}
public ClassTest() {
Map<Class<? extends A>, A> map = new HashMap<>();
A d = new D();
A e = new E();
map.put(d.getClass(), d);
map.put(e.getClass(), e);
System.out.println(B.class.getSimpleName() + ": " + map.get(B.class));
System.out.println(C.class.getSimpleName() + ": " + map.get(C.class));
}
public static void main(String[] args) {
new ClassTest();
}
}
预期的输出为:
B: D
C: E
实际输出为:
B: null
C: null
据我所知,该案例“预计”会失败,因为B.class
将不等于D.class
,即使D
类是B
接口的实现。。。因此map.get(...)
无法找到关联键的实例值。(如果我错了,请纠正我。)上面的例子很有希望显示出我想要完成的事情背后的意图和“精神”
是否有一个好的/优雅的替代方案,既能起作用,又能保持我所尝试的精神
我目前正在更新代码,以替换被用作Class<T>
的“开放集”的枚举类型作为类型标记,这有点类似于有效Java,第2版,第29项
根据@CKing在评论中的要求,下面引用了这本书中促使我采用这种方法的部分
The client presents a
Class
object when setting and getting favorites. Here is the API:// Typesafe heterogeneous container pattern - API public class Favorites { public <T> void putFavorite(Class<T> type, T instance); public <T> T getFavorite(Class<T> type); }
Here is a sample program that exercises the
Favorites
class, storing, retrieving, and printing a favoriteString
,Integer
, andClass
instance:// Typesafe heterogeneous container pattern - client public static void main(String[] args) { Favorites f = new Favorites(); f.putFavorite(String.class, "Java"); f.putFavorite(Integer.class, 0xcafebabe); f.putFavorite(Class.class, Favorites.class); String favoriteString = f.getFavorite(String.class); int favoriteInteger = f.getFavorite(Integer.class); Class<?> favoriteClass = f.getFavorite(Class.class); System.out.printf("%s %x %s%n", favoriteString, favoriteInteger, favoriteClass.getName()); }
As you might expect, this program prints
Java cafebabe Favorites
.
请理解,我知道这本书的示例是有效的,因为它使用了特定的具体值类(例如,对于实际的String
,使用String.class
,而不是从String
派生的某个假设的类型,等等),如前所述,这只是激发了我的方法来看看我的测试用例是否有效,现在,我正在寻找一种解决方案或替代方案,它尊重我打算在测试用例上做的事情的“精神”
共 (0) 个答案