【发布时间】:2014-07-04 03:33:56
【问题描述】:
CharSequence[] items = { “Google”, “Apple”, “Microsoft” };
如果CharSequence是一个接口,那么在上面的例子中我们不是实例化一个接口吗?
【问题讨论】:
-
您正在为接口定义的 type 数组分配初始值。
标签: java interface charsequence
CharSequence[] items = { “Google”, “Apple”, “Microsoft” };
如果CharSequence是一个接口,那么在上面的例子中我们不是实例化一个接口吗?
【问题讨论】:
标签: java interface charsequence
您正在实例化一个String 数组,然后将其分配给具有CharSequence 数组类型的变量。这是因为String 可以分配给(实现)CharSequence。这里还有几个例子:
CharSequence cs = "Whatever";
List<Integer> list = new ArrayList<>();
因此,您实际上是在实例化具体类型并将它们分配给具有接口类型的变量/字段。
【讨论】:
这是一个使用自定义类的类似示例:
interface A{}
class A1 implements A{}
class A2 implements A{}
class A3 implements A{}
public class B {
A[] items = {new A1(),new A2(), new A3()};
}
items 中的每个对象实际上都是实现类型 (A1,A2,A3) 而不是 A 本身。
在你的例子中,这样的事情也是可能的:
CharSequence[] items = {"Google",new StringBuffer("Apple"), new StringBuilder("Microsoft")};
【讨论】:
CharSequence[] items = { “Google”, “Apple”, “Microsoft” };
这里只有引用变量声明的类型是接口,没关系。
但数组中的对象是 String 对象——其类实现了 CharSequence 接口。
说,CharSequence[] items = { new Charsequence() } 会导致编译错误
而
CharSequence[] items = { new someclass() }
在哪里
class someclass 实现 CharSequence {
//
}
没问题
【讨论】: