【问题标题】:How created method with signature as List如何创建签名为 List 的方法
【发布时间】:2010-05-17 14:30:52
【问题描述】:

我对 Java 编程语言很陌生,所以这可能是个愚蠢的问题,但我不得不问它,因为我自己无法弄清楚。这是交易。

我想创建从列表中提取特定对象类型的方法。所以该方法应该接收 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&lt;?&gt; 作为方法参数声明方法的问题是我收到来自eclipse Syntax error on token "&gt;", 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
}

【问题讨论】:

    标签: java generics collections


    【解决方案1】:
    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;
    }
    

    您的实例需要一个变量

    还有回报。

    【讨论】:

    • 是否可以通过额外的强制转换它不会以其他方式编译
    • @London,您需要 Cast 是正常的,您没有将 Class 类型传递给您的列表。
    • 无法传递Class类型,因为我不知道这个对象的类类型,我正在尝试提取它
    • @London 这就是你需要做演员的原因。
    【解决方案2】:

    我会做这样的事情 - 请注意,我的语法可能是错误的,但想法是一样的。

    // 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");
    }
    

    在 cmets 中,也可以考虑 clazz.isAssignableFrom(otherClazz)

    【讨论】:

    • @glowcoder 可以通过额外的强制转换,它不会以其他方式编译
    • 在第一个 sn-p 中 - 你能做到 obj instanceof clazz 吗?如果可以,它是否按预期工作?没想到,我还以为你需要clazz.isAssignableFrom(obj)
    • @glowcoder: -1 因为你不能做obj instanceof [a Class object]。这是不可能的。您必须执行类似if (clazz.isInstance(obj)) 的操作 PS:instanceof 是小写字符的两倍。
    • 正如我明确指出的,语法可能不正确,但概念正确。是的,我习惯默认使用驼峰式套管,而 instanceof 并不是我经常使用的东西。 -哎呀-我会修骆驼案的。
    【解决方案3】:

    当你使用泛型时,你可以这样做

    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 对类型检查进行硬编码更可取,因为这样做会导致每种类型都需要一个不同的方法,除了返回类型和 instanceof 检查之外,所有这些方法几乎相同。

    【讨论】:

    • 不同之处在于您可以使用此方法来检索这两种类型。当您通过 instanceof 而不是 Class.isInstance 对实例检查进行硬编码时,您只能返回一种类型。查看我的编辑。
    【解决方案4】:

    两者之间没有什么区别。根据 javadoc,This method is the dynamic equivalent of the Java language instanceof operator.

    【讨论】:

      猜你喜欢
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 2011-09-01
      • 2018-06-19
      • 2010-10-04
      • 1970-01-01
      相关资源
      最近更新 更多