为什么有可能新建一个接口数组

时间:2017-08-10 10:16:58

标签: java arrays interface casting

为什么Java中可以使用以下内容?

Integer[] ints = (Integer[])new Comparable[10];

但它在运行时获得ClassCastExceptionnew接口数组的用例是什么。

6 个答案:

答案 0 :(得分:6)

回答具体问题:

Comparable toComplare[] = new Comparable[10];

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

重点是:界面表示“常用功能” - 可以查看<视图”。

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

所以你可以这样做:

toCompare[0] = new Integer(5);
toCompare[1] = new BigDecimal("3.2");
...

我并不是说这是你经常使用的东西,但正如所说 - 它允许你在他们能力的某个特定“视图”下“收集”对象。值得指出的是:拥有这样一个阵列意味着您可以做到:

toCompare[0].compareTo(toCompare[1]);

成功!

除此之外:强制转换总是意味着你,程序员知道编译器不知道的东西。所以编译器退后一步,让你这样做 - 假设你知道你在做什么。但是,正如您在问题中显示的代码显然正确,现实会在运行时回来咬你。是的,可以在编译时确定给定的代码是不正确的。

答案 1 :(得分:1)

注意这种情况:您有一个接口和两个(或更多)实现该接口的类:

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");}
}

你这样称呼它:

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();
}

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

答案 2 :(得分:1)

imwrite("../../pat/Gray_Image.jpg", image_source); imwrite("../pat/Gray_Image.jpg", image_source); imwrite("/pat/Gray_Image.jpg", image_source); imwrite("\\pat\\Gray_Image.jpg", image_source); imwrite("//pat//Gray_Image.jpg", image_source); imwrite("\pat\Gray_Image.jpg", image_source); 实施Integer,并不意味着Comparable实施Integer[],因此您无法转换不同类型的数组。但是,您可以将Comparable[]放入Integer数组的元素中。

答案 3 :(得分:1)

编译器查看右侧的类型,并看到它是Comparable的数组。一般来说,它可能Integer[](因为它可以分配给Comparable[])。

我们知道它不会是Integer[],因为右手表达式是一个构造函数调用。但编译器看起来并不那么远。它使用相同的逻辑,就好像该表达式是声明类型为Comparable[]的方法调用一样。它没有查看实际类型。

因此编译器将接受您的类型转换,因为可能成功。它只会拒绝根本无法解决的转换(根据声明的类型),例如将Integer转换为String

请注意,允许阵列中的这种协方差可能是一个设计缺陷。您可以将Integer[]投射到Comparable[],但这有问题,因此无法List<Integer>投射到List<Comparable>

答案 4 :(得分:0)

  1. ClassCastException的原因是堆污染。 在http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ050
  2. 中查找更多详细信息
  3. new对接口数组/只是接口的用例是用实现的任何类对象填充该接口(或)给出匿名内部类定义< / em>的

答案 5 :(得分:0)

这是因为您正在执行缩小参考转换

Integer类实现了Comparable接口:

public final class Integer extends Number implements Comparable<Integer>

请参阅:5.1.6. Narrowing Reference Conversion

  

从任何数组类型SC []到任何数组类型TC [],前提是SC和TC是引用类型,并且从SC到TC有一个缩小的引用转换。

     

此类转换需要在运行时进行测试,以确定实际参考值是否是新类型的合法值。如果没有,则抛出ClassCastException。