有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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 favorite String, Integer, and Class 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) 个答案