首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么可以新建接口的数组

问为什么可以新建接口的数组
EN

Stack Overflow用户
提问于 2017-08-10 18:16:58
回答 6查看 110关注 0票数 3

为什么在Java中可以实现以下功能?

代码语言:javascript
复制
Integer[] ints = (Integer[])new Comparable[10];

但它在运行时会获得ClassCastException。new一个接口数组的用法是什么。

EN

回答 6

Stack Overflow用户

发布于 2017-08-10 18:21:03

要回答特定问题,请执行以下操作:

代码语言:javascript
复制
Comparable toComplare[] = new Comparable[10];

为什么不创建一个允许您存储实现可比较接口的任何对象的数组?!

要点是:接口表示一个“公共功能”--只查看该“视图”中的对象可能会很有帮助。

当然,存储在该数组中的对象总是某种“真实”类--但所有这些对象都将实现Comparable接口提供的功能。

所以你可以这样做:

代码语言:javascript
复制
toCompare[0] = new Integer(5);
toCompare[1] = new BigDecimal("3.2");
...

我并不是说这是你经常使用的东西,但正如我所说的-它允许你在特定的、特定的“视图”下“收集”对象的功能。同样值得指出的是:拥有这样的数组是否意味着您可以使用而不是:

代码语言:javascript
复制
toCompare[0].compareTo(toCompare[1]);

成功!

除此之外:类型转换总是暗示着你,程序员知道一些编译器不知道的东西。因此,编译器后退一步,让你这样做-假设你知道你在做什么。但是,由于您在问题中显示的代码显然是不正确的,因此在运行时,实际情况会反过来伤害您。是的,可以在编译时确定给定的代码是不正确的。

票数 6
EN

Stack Overflow用户

发布于 2017-08-10 18:20:37

关于本例:您有一个接口和两个(或更多)实现该接口的类:

代码语言:javascript
复制
interface MyInterface
{
    public void someMethod();
}

class MyClass1 implements MyInterface
{
    public void someMethod() { System.out.println("foo");}
}

class MyClass2 implements MyInterface
{
    public void someMethod() { System.out.println("bar");}
}

你可以这样称呼它:

代码语言:javascript
复制
public static void main(String[] args)
{
    MyInterface[] array = new MyInterface[2];
    array[0] = new MyClass1();
    array[1] = new MyClass2();

    array[0].someMethod();
    array[1].someMethod();
}

接口的数组提供了在数组中保存该接口的不同实现的方法

票数 1
EN

Stack Overflow用户

发布于 2017-08-10 18:21:58

让Integer实现Comparable,并不意味着Integer[]实现了Comparable[],所以你不能转换不同类型的数组。但是,您可以将Integer放入Comparable[]数组的元素中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45610915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档