我有一个函数,它有两个不同类型的列表参数输入。为了优化,我想创建一个最小列表类型的HashSet / Hashtable(其中任何一个)。 java中有没有办法在运行时决定type of Set
?
当前代码:
public static void innerJoinHash(List<SportsMan> sportsMans, List<Sport> sportList) {
if (sportsMans.size() < sportList.size()) {
Set<SportsMan> set = new HashSet<SportsMan>();
} else {
Set<Sport> set = new HashSet<Sport>();
}
}
我想做什么:
public static void innerJoinHash(List<SportsMan> sportsMans, List<Sport> sportList) {
Set< // some magic //> set
if (sportsMans.size() < sportList.size()) {
set = new HashSet<SportsMan>();
} else {
set = new HashSet<Sport>();
}
}
答案 0 :(得分:1)
您可以尝试使用Java Generics。 Set<E> customSet=new HashSet<E>();
这是一种可以在运行时使用分配数据类型的方法。
public static void innerJoinHash(List<SportsMan> sportsMans, List<Sport> sportList) {
Set set = new HashSet();
if (sportsMans.size() < sportList.size()) {
set.addAll(sportsMans)
} else {
set.addAll(sportList);
}
}
答案 1 :(得分:1)
&#34; //一些魔法//&#34;您正在寻找的是Sport
和SportsMan
中最具体的常见超类型。即,如果两个类都实现或扩展了公共接口,则可以使用它。否则,它将是Object
:
Set<Object> set = new HashSet<>(
sportsMan.size() < sportsList.size()
? sportsMan : sportsList);
答案 2 :(得分:0)
也许我不明白你的问题,但这种做法有什么不对?
Set myset = new HashSet();
myset.add("Hello");
myset.add(new Long(1));
如果你使用Set或Set将其愚蠢,那么你将无法获得泛型。
答案 3 :(得分:0)
创建Set as Object的类型,并且在检索时运行时,您始终可以将对象转换为所需的数据类型。
OR
public static void innerJoinHash(List<SportsMan> sportsMans, List<Sport> sportList) {
if (sportsMans.size() < sportList.size()) {
Set set = new HashSet<SportsMan>();
} else {
Set set = new HashSet<Sport>();
}
}