如何使用签名创建方法作为List

时间:2010-05-17 14:30:52

标签: java generics collections

我是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
}

4 个答案:

答案 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.