当前位置: 首页 > 面试题库 >

为什么将ArrayList的泛型转换为超类不起作用?

仉磊
2023-03-14
问题内容

有人可以向我解释为什么//this line gives a compile error (why?)以下代码示例中标记的行不起作用吗?

import java.util.ArrayList;

public class GenericCastCheck {

    class A{
    }

    class B extends A{
    }

    public static void main(String[] args) {

        A aObject = new A();
        B bObject = new B();

        //this line works fine
        aObject = bObject;
        //this line gives a compile (expected)
        bObject = aObject;

        ArrayList<A> aList = new ArrayList<A>();
        ArrayList<B> bList = new ArrayList<B>();

        //this line gives a compile error (why?)
        aList = bList;
        //this line gives a compile error (expected)
        bList = aList;
    }
}

具体来说,当我们说bList类型为时ArrayList<B>,这并不表示它的每个元素都是的实例B吗?如果是这样,那么它是什么铸造的问题ArrayList<A>,如果我们都可以投射单个实例BA

谢谢。


问题答案:

问题是这样的:

ArrayList<A> aList = new ArrayList<A>();
ArrayList<B> bList = new ArrayList<B>();
aList = bList; // if this were valid...
aList.add(new A()); // ...what should happen here?
B b = bList.get(0); // ...and here?

如果对数组执行相同的操作,则在运行时会在第4行获得ArrayStoreException。对于泛型集合,已决定在编译时避免这种情况。



 类似资料:
  • 问题内容: 我想声明一个type 。 为什么以下原因给我一个错误: 但是以下工作原理: ? 问题答案: 只能引用类型,不能引用基元。是一类,而不是原始的。 声明时,您将创建一个将存储类型而不是原始类型的。 如果您想了解基本类型和引用类型之间的区别,请查看http://pages.cs.wisc.edu/~hasti/cs302/examples/primitiveVsRef.html

  • 问题内容: 我正在制作一个类,以便模拟C ++中的函数指针的功能。最初,我只用s 做所有事情,但后来我有了一个想法- 为什么不使其真正通用? 问题出在这个构造函数上,该构造函数试图使用签名调用另一个构造函数: 我以为这会很好,但是我收到了以下编译器错误: 因此,我很困惑,我这样做: 现在可以编译,但是我收到以下警告: 我想问题是我不明白这意味着什么。我认为,由于从参数推断出的类型,因此有 必要 调

  • 此代码有效。它以“未检查或不安全操作”警告进行编译和运行。 当这两个给我运行时错误时 我遇到的错误如下:

  • 我想说得具体一点。我有一个名为Result的类和一个名为Result的派生类 这些类在方法中用作返回类型。为此,我创建了这个helper类: 正如您所看到的,上面的代码对于成功有两种返回类型,一种是如果您不想返回任何东西,另一种是如果您想返回一些东西,但是失败的结果永远不会返回什么东西。这是不必要的,只是一个错误消息。这使我想到以下问题:当我想创建一个可以使用返回类型返回Success,而不使用返

  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类