0

我有一个使用 aHashMap<Integer, ArrayList<CustomObject1>> map作为参数的函数。但是,现在功能已经扩展,我需要使用包含ArrayList<CustomObject2>>.

我研究了泛型并尝试传入,HashMap<Integer, ArrayList<? extends CustomObjectBase>> map但我需要知道实际传入的内容,以便我做出相应的回应。由于类型擦除,使另一个功能不起作用。我也尝试过使用java instanceof,但这也不起作用。

关于如何解决这个问题的任何建议?谢谢!

4

2 回答 2

2

我以前自己花了几个小时尝试这个,但这是徒劳的。通常最好将类作为参数传递,如下所示:

public void <T> handle(HashMap<Integer, ArrayList<T>> map, Class<T> clazz)
{
    // do whatever you need to, based on 
}

然后,你会这样称呼它:

var map1 = new HashMap<Integer, ArrayList<CustomObject1>>();
// map1 populate...
var map2 = new HashMap<Integer, ArrayList<CustomObject2>>();
// map1 populate...
var h = new Handler();
h.handle(map1, CustomObject1.class);
h.handle(map2, CustomObject2.class);
于 2019-08-13T00:45:56.770 回答
1

instanceof是你的朋友:

if (map instanceof CustomObject1) {
    //...
} else {
    //...
}

此外,您也可以使用方法重载。您有您正在谈论的方法 1,但您需要在类型之间进行一些区分。您需要的自定义逻辑可以委托给 method2,如果它们不同,您可以实现不同的重载。

当然,如果您的数组列表不为空,也map.get(0).getClass().getName()可以在这里派上用场。

于 2019-08-13T01:01:39.440 回答