我是Java编程语言的新手,所以这可能是一个愚蠢的问题,但我不得不问它,因为我无法自己弄明白。这是交易。
我想创建从列表中提取某些对象类型的方法。因此该方法应该接收List作为参数,意味着list应该包含Object1或Object2。我试过这样的事:
public Object1 extractObject(List<Object>){
//some pseudo-code
... loop trough list and check if list item is instance of object one return that instance
}
使用List<?>
作为方法参数声明方法的问题是我从eclipse Syntax error on token ">", VariableDeclaratorId expected after this token
收到编译错误。
如何正确设置方法签名以接受Object1或Object2的对象类型?谢谢
这是我的代码:
protected Object1 getObject1(List<Object> list){
for(Object obj : list) {
if(obj instanceof Object1) {
return (Object1) obj;
}
}
return null;
}
编辑 - 这两者之间的区别是什么:
public Object1 getObject1(List<Object> list){
for(Object obj : list) {
if(obj instanceof Object1) {
return (Object1) obj;
}
}
return null;
}
public Object1 extractObject(List<Object> list, Class<Object1> type) {
for(Object obj : list) {
if(type.isInstance(obj)) {
return (Object1)obj;
}
}
return null; // no match found
}
答案 0 :(得分:3)
public Object1 extractObject(List<?> list){
//some pseudo-code
... loop trough list and check if list item is instance of object one return that instance
return null;
}
您的实例需要一个变量
回归。
答案 1 :(得分:1)
我会做这样的事情 - 请注意,我的语法可能有误,但想法是一样的。
// this works for any type - just pass in an Object1
public Object extractObject(List<?> list, Class clazz) {
for(Object obj : list) {
if(obj.getClass().equals(clazz) {
return obj;
}
}
return null; // no match found
}
非通用:
// this works for just one type
public Object1 extractObject(List<?> list) {
for(Object obj : list) {
if(obj.getClass().equals(Object1) {
return obj;
}
}
return null; // no match found
}
使用此驱动程序测试概念:
public static void main(String[] args) {
Class c = "".getClass();
if("".getClass().equals(c)) System.out.println("true");
else System.out.println("false");
}
从评论中,也可以考虑clazz.isAssignableFrom(otherClazz)。
答案 2 :(得分:1)
当您使用泛型时,您可以
public <T> T extractObject(List<?> list, Class<T> type) {
for(Object obj : list) {
if(type.isInstance(obj)) {
return (T)obj;
}
}
return null; // no match found
}
这将使您的方法的返回类型与您要查找的类型相同。
多亏了泛型,我们可以使用相同的方法来提取不同类型的对象:
Object1 object1 = extractObject(list, Object1.class);
Object2 object2 = extractObject(list, Object2.class);
这是使用obj instanceof Object1
对类型检查进行硬编码的首选,因为这样做会导致每种类型需要一个不同的方法,除了返回类型和检查实例之外,它们几乎完全相同。
答案 3 :(得分:0)
两者之间的区别是什么。根据javadoc,This method is the dynamic equivalent of the Java language instanceof operator.