拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 为Class型别传入的自变量

为Class型别传入的自变量

白鹭 - 2022-02-24 2100 0 0

我正在尝试制作一个通用的 Stack 类,如图所示

public class Stack<T> {
    public Stack(Class<T[]> type, int capacity) {
        this.capacity = capacity;
        array = type.cast(Array.newInstance(type,capacity));
    }
}

但是我不确定在实体化时应该输入什么型别,因为我想这样做

MyClass[] c = new MyClass[0];
myStack = new Stack<MyClass>(c.getClass(), 100);

但是我收到以下错误

Required type: Class <MyClass[]>
Provided: Class <capture of ? extends MyClass[]>

所以我想用

c.getClass().cast()\

但我不确定在 cast() 里面放什么,因为它不需要

Class<MyClass[]>

现在我被困住了。

uj5u.com热心网友回复:

这个实作的整体设计很脆弱。我们混合了两种语言结构:阵列和泛型。这两种结构在两个主要方面有所不同:阵列是协变的和保留的,而泛型是不变的和被洗掉的(请参阅eagertoLearn 的这个问题了解原因)。混合两者是灾难的秘诀。
此外,我们需要组件型别来呼叫Array::newInstance. 现在,我们传递容器型别。

我建议使用一个Object[]作为后备资料结构并使访问器通用以保证型别安全。这也是ArrayList. 这种方法将导致(至少)一个无法避免的未经检查的强制转换。我把它留给读者

  • 找到未经检查的演员表 ArrayList
  • 争论为什么演员被纠正并且永远不会导致实际ClassCastException,只要内部阵列永远不会泄漏。

uj5u.com热心网友回复:

您可以通过[]在类名后添加来参考型别化阵列

myStack = new Stack<MyClass>(MyClass[].class, 100);
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *