[英]Java - Type vs instance type
当我做类似的事情时:
List<Integer> myList = new LinkedList<>();
对象类型为List的“ myList”吗? 我对正确的定义更感兴趣。 这样说是否正确:
myLyst的类型为List,但其实例的类型为LinkedList?
这对我来说没有意义,因为对象只能是一种类型。 因此,也许最好说它是LinkedList类型,但仅限于接口List?
myList
有一个具体的运行时类,即LinkedList
。
但是LinkedList
作为类型,是List
的子类型,因此说myList
是 List
也是正确的。
在运行时确定的是,一个对象只有一个运行时类,在本例中为LinkedList
。 可以通过调用myList.getClass()
来读取myList.getClass()
。
但是检查类型层次结构,即对象是否是给定类型的实例(类或接口),并不要求要检查其类型的是类。 所以:
myList instanceof LinkedList //true
myList instanceof List //true
myList instanceof Collection //true
myList instanceof ArrayList //false,
//because it's not an instance of ArrayList,
//and LinkedList is not a subtype of ArrayList
LinkedList
类实现List
接口。 myList
是LinkedList
类的实例,因此是LinkedList
类型。
由于接口不是类型,因此myList
的类型myList
是List
,因为List
的接口不是类型。
我希望这个答案可以使事情变得清晰起来吗?
我会说变量的静态类型是List,而其运行时类型是LinkedList。
LinkedList实现List的事实显然使得这成为可能。
在讨论重写(继承和虚拟调用)和重载(具有不同参数的不同方法-参数仅考虑静态类型)时,区别非常重要。
Java List是扩展Collection接口的接口。 图片显示了层次结构
现在,正确的方法是,说“ myList”是当前保存LinkedList类实例的接口变量。 您也可以从另一个类比中看它,接口只是一个抽象表示,因此我们永远无法创建类型为List的对象,因此它只能用于保存实现它的类的对象的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.