如果我的代码如下:
Collection<Object> c = new HashSet<Object>();
它是否仍会保留集合无法包含重复值的属性。换句话说,在下列情况下会发生什么?
String h = "Hello World!";
c.add(h);
c.add(h);
答案 0 :(得分:2)
是的,Set
的行为和属性仍然有效。 c
只会包含一个"Hello World!"
public static void main(String[] args)
{
Collection<Object> c = new HashSet<Object>();
String h = "Hello World!";
c.add(h);
c.add(h);
System.out.println("c contains " + c.size() + " item(s): " + c);
System.out.println("c is an instance of " + c.getClass());
}
以上main
方法输出:
c contains 1 item(s): [Hello World!]
c is an instance of class java.util.HashSet
答案 1 :(得分:2)
你不是“构建一个集合”;你只是创建一个新的参考。所以,是的,所有底层属性仍然存在,因为它仍然是您正在调用的原始对象的方法。
答案 2 :(得分:1)
简短:是的 - 即使引用变量类型是HashSet的超类型,它仍然是HashSet的对象。
答案 3 :(得分:1)
HashSet<T> theSet = new HashSet<T>();
Collection<T> collection = theSet;
Iterable<T> iterable = theSet;
Object object = theSet;
所有这四个变量都是不同的类型(顺便说一下,它们都必须是HashSet
的超类型),但它们都引用了类型为HashSet
的同一个对象。无论您使用什么变量来访问对象,它总是以相同的方式运行。这是polymorphism的主要功能之一。
唯一的区别是你移动继承树越高(向上意味着更普遍的类型),你可以访问的方法和字段越少。因此,您无法调用object.iterator()
,iterable.size()
等方法,但是当您调用所有变量的公共方法时,它的行为方式总是相同:
theSet.toString(); // produces []
collection.toString(); // produces []
iterable.toString() // produces []
object.toString(); // produces []
答案 4 :(得分:0)
String h = "Hello World!";
c.add(h);//Returns true
c.add(h);//Returns false since duplicate elements are not allowed in HashSet
So only one instance of h will be added to HashSet