【问题标题】:Using an array of any Object as a parameter in java then using methods declared in both objects在java中使用任何对象的数组作为参数,然后使用两个对象中声明的方法
【发布时间】:2025-08-14 19:00:02
【问题描述】:

我有一个这样的方法头

public static void test (Object[] queue) {
     queue.dequeue();
}

Object 将是 ArrayListQueue 或 LinkedListQueue 并且在任何一种情况下都将存储字符串。无论哪种情况,都已经编写了出队的工作书面方法。

我实际上希望该方法像这样工作

public static void test ( (ArrayListQueue or LinkedListQueue) [] queue) {
     queue.dequeue();
}

有人知道吗?谢谢。

编辑:对象无法实现接口。

【问题讨论】:

标签: java methods types parameters parameter-passing


【解决方案1】:

这通常使用通用超类(或接口)来完成:

abstract class Type0 {
    abstract void deque();
}

class Type1 extends Type0 {
    @Override
    void deque() { thing1(); }
}
class Type2 extends Type0 {
    @Override
    void deque() { thing2(); }
}

public static void test(Type0[] queue) {
    for(Type0 t : queue) t.deque();
}

偶尔强制转换是合适的:

public static void test(Object[] queue) {
    for(Object o : queue) {
        if(o instanceof Type1) {
            Type1 t1 = (Type1)o;
            t1.deque1();
        } else if(o instanceof Type2) {
            Type2 t2 = (Type2)o;
            t2.deque2();
        }
    }
}

另见inheritance tutorial

【讨论】:

  • “例如:ArrayQueue[] 队列或 LinkedListQueue[] 队列” 这就是我的回答所针对的内容。 ArrayQueue[] 是一个元素为ArrayQueue 的数组,LinkedListQueue[] 是一个元素为LinkedListQueue 的数组。我的回答通常是ArrayQueueLinkedListQueue 会有一个共同的超类。如果您仍然认为这不能解决您的问题,那么您应该编辑问题以澄清您的意思。
【解决方案2】:

只需定义两个具有不同类型参数的方法和一个用于实际实现的私有方法。像这样的:

public static void test(ArrayListQueue[] queue) {
    testImpl(queue);
}

public static void test(LinkedListQueue[] queue) {
    testImpl(queue);
}

private static void testImpl(Object[] queue) {
    for (Object obj : queue) {
        if (obj instanceof Queue1) {
            ((Queue1) obj).dequeue();
        } else if (obj instanceof Queue2) {
            ((Queue2) obj).dequeue();
        } else {
            // Another queue
        }
    }
}

【讨论】:

    【解决方案3】:

    要么重载:

    public static void test (ArrayListQueue[] queue) {
        queue.dequeue();
    }
    
    public static void test (LinkedListQueue[] queue) {
        queue.dequeue();
    }
    

    或抽象类型(仅当两个类都实现/扩展一个公共类型时才有可能:

    public static void test (SomeCommonQueue[] queue) {
        queue.dequeue();
    }
    

    第二个选项更可取:见Liskov substitution principle

    【讨论】:

      最近更新 更多