我最近在探索javafx时碰到了下面的代码,我看到 ObservableList 是一个接口,没有实现它,你怎么能使用它的变量?显而易见我在这里遗漏了什么,有人能指出我正确的方向吗?
List list = new ArrayList(); ObservableList observableList = FXCollections.observableList(list); observableList.addListener(new ListChangeListener() { @Override public void onChanged(ListChangeListener.Change change) { System.out.println("Detected a change! "); } });
答案 0 :(得分:6)
FXCollections.observableList()
方法返回实现该接口的类的实例。你没有在这里看到这个类的名称,但你不需要看到它(或者甚至需要知道它是什么。)这是多态的整个过程 - 面向对象编程:你,客户端,只处理接口;创建实现它的实际类或类集是其他人的工作。如果你得到这一点,那么你已经掌握了一些东西。
答案 1 :(得分:0)
当然,您可以使用具有接口类型的变量:您不能 istantiate 它(不调用new ObservableList()
),但是实现该类的任何类的实例interface对该变量有效。
答案 2 :(得分:0)
由于我无法在此处更好地解释,请查看此解释:using interfaces as variables
答案 3 :(得分:0)
FXCollections.observableList()
必须返回具体类的实例,或null
。
如果您提供的代码确实有效,则结果不能为null
,因为在这种情况下observableList.addListener(...)
会抛出NullPointerException
。
由此可见FXCollections.observableList()
确实返回非null
引用。
因此,假设“没有[ObservableList
]的实现”是错误的:必须在某处实现ObservableList
。您可能无法访问它,但它确实存在。
如果可以,请查看FXCollections.observableList()
的源代码。
答案 4 :(得分:0)
是的,正如上层所说.... FXCollections.observableList()方法返回一个实现ObservableList接口的类的实例...... t
答案 5 :(得分:0)
http://docs.oracle.com/javafx/2.0/api/javafx/collections/ObservableList.html
那是接口,FXCollections.observableList()
正在返回一个实现它的对象。您将在JavaDoc中注意ObservableList
扩展Observable
... addListener()
来自哪里。
答案 6 :(得分:0)
我认为这段代码:
FXCollections.observableList(list);
表示此方法获取接口的实现,您可以下载源来检查它。
答案 7 :(得分:-2)
实施是anonymous class。