所以我想知道一种在Java中切换有效类型的简单方法,如下所示:
(我知道它不会编译,但是我需要此功能)
public void put(Object obj) {
if (obj instanceof Integer) {
} else if (obj instanceof String) {
} else if (obj instanceof Boolean) {
} else if (obj instanceof List<String>) {
} else if (obj instanceof Map<String, String>) {
}
}
答案 0 :(得分:4)
简单的答案是:Java中没有否开启“类型”。与Scala之类的语言相比,Java没有几乎不可思议的“模式匹配”功能。
当您确实需要这样做时:确定对象实例的特定类型,然后根据对象的真实性质执行不同的操作,例如if / else级联是少数选择之一。
一种替代方法是使用地图,例如Map<Class<?>, Consumer<?>)
等。换句话说:您(预先)创建了一个知道方法的地图以调用不同的类,然后执行obj.getClass()
以查看您的地图是否知道该类。但是该机制不是很健壮,因为它仅对类实例使用equals()
。
除此之外:只有很少的选择用例可以进行这种“类型切换”。通常,您可以通过后退一步,查看 real 潜在问题并设计完全不同的解决方案来解决此问题。
答案 1 :(得分:1)
您可以通过以下方式进行检查:
public void put(Object obj) {
if (obj instanceof Integer) {
} else if (obj instanceof String) {
} else if (obj instanceof Boolean) {
} else if (obj instanceof List) {
List list = (List) obj;
if(!list.isEmpty()){
if(list.get(0) instanceof String){
List<String> listString=(List<String>)obj;
//Do what you want to do
}
}
} else if (obj instanceof Map) {
Map map = (Map) obj;
if(!map.isEmpty()){
Map.Entry entry = (Entry) map.entrySet().iterator().next();
if(entry.getKey() instanceof String && entry.getValue() instanceof String){
Map<String,String> mapStrind= (Map<String,String>)obj;
//Do what you want to do
}
}
}
}
答案 2 :(得分:0)
使用Object.getClass()
。它返回对象的运行时类型。
答案 3 :(得分:-1)
否,没有内置函数。开关只能打开整数和字符串,唯一的其他结构是if
。
您可以尝试使用Class对象作为键的映射,因为对于每个对象,您都可以执行getClass()
操作并获得代表其类的“令牌”。
更多坏消息:您永远无法在运行时中找到通用部分(因此您永远无法告诉List<String>
中的List<Integer>
),该信息不可用。