繁体   English   中英

Java varargs需要无限数量的变量

[英]Java varargs to require indefinite number of variables

我正在尝试使用varargs。 我已经声明了一个方法,该方法需要不确定数量的变量,如下所示:

private Subject carMonitor;

public AdvancedMonitor(Subject ... carMonitors){
    for (Subject carMonitor : carMonitors){
    this.carMonitor = carMonitor;
    carMonitor.registerObserver(this);
    }
}

但是,当我尝试在main方法中调用它时,除了一个参数外,我无法使用其他任何东西:

    BigCar bigCar = new BigCar();
    SmallCar smallCar = new SmallCar();
    AdvancedMonitor doubleAdvancedDisplay1 = new AdvancedMonitor();
    AdvancedMonitor doubleAdvancedDisplay2 = new AdvancedMonitor(bigCar);
    AdvancedMonitor doubleAdvancedDisplay3 = new AdvancedMonitor(bigCar, smallCar);

仅第二个有效。 为什么是这样?

在此处输入图片说明

与我的界面有关吗?

public interface Subject {
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObservers();
}

大型汽车界面-小型汽车目前大致相同:

public class BigCar implements Subject {
    private ArrayList observers;
    private int state;

    public BigCar(){
        observers = new ArrayList();
    }

    public void registerObserver(Observer o){
        observers.add(o);
    }

    public void removeObserver(Observer o){
        int i = observers.indexOf(o);
        if (i >= 0){
            observers.remove(i);
        }
    }

    public void notifyObservers(){
        for (int i = 0; i < observers.size(); i++){
            Observer observer = (Observer)observers.get(i);
            observer.update(state);
        }
    }

    public void stateChanged() {
        notifyObservers();
    }

    public void setState(int state){
        this.state = state;
        stateChanged();
    }
}

我写以下代码:

public class Test {
    public static class AdvancedMonitor {
        private String carMonitor;

        public AdvancedMonitor(String... carMonitors) {
            for (String carMonitor : carMonitors) {
                this.carMonitor = carMonitor;
                System.out.println(this.carMonitor);
            }
        }
    }

    public static void main(String[] args) {
        String bigCar = "bigCar";
        String smallCar = "smallCar";
        System.out.println("step 1");
        AdvancedMonitor doubleAdvancedDisplay1 = new AdvancedMonitor();
        System.out.println();
        System.out.println("step 2");
        AdvancedMonitor doubleAdvancedDisplay2 = new AdvancedMonitor(bigCar);
        System.out.println();
        System.out.println("step 3");
        AdvancedMonitor doubleAdvancedDisplay3 = new AdvancedMonitor(bigCar, smallCar);
    }
}

我有以下结果:

step 1

step 2
bigCar

step 3
bigCar
smallCar

我认为,一切正确。 您的情况有什么问题? 您是否使用loggingSystem.out.println调试问题? 看来您的问题与Java varagrs无关,但是carMonitor.registerObserver(this)存在一些异常。

PS另外,您了解每个AdvancedMonitor都只有一个可变的carMonitor? 并使用new AdvancedMonitor(bigCar, smallCar); 结果,只有在private String carMonitor;才具有AdvancedMonitor private String carMonitor;

PPS在construstor中使用this也是一个坏主意,因为在运行construstor时对象并不是真正创建的。

实际上,构造函数可以工作。

请检查以下语句:
SmallCar和BigCar都实现Subject
AdvancedMonitor类实现Observer
AdvancedMonitor doubleAdvancedDisplay没有多次声明,但是在您的代码中是多次声明 它应该像这样:

AdvancedMonitor doubleAdvancedDisplay1 = new AdvancedMonitor();
AdvancedMonitor doubleAdvancedDisplay2 = new AdvancedMonitor(bigCar);
AdvancedMonitor doubleAdvancedDisplay3 = new AdvancedMonitor(bigCar, smallCar);

希望对您有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM