java—示例化接受泛型集合的对象

apeeds0o  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(364)

我正在学习java泛型,并尝试改编一些作为练习而开发的代码。
特别是,我开发了一个 ArrayVisualizer 类,该类使用sedgewick的stddraw库来可视化和动画动态数组的行为。我有自己的动态数组类,它支持泛型,我正在尝试扩展 ArrayVisualizer 任何类似于这个数组的东西。
简而言之,我的问题是:如何处理包含其他泛型类型的泛型类型?
以下是我的思考过程:
我开始做这个界面:

public interface IterableCollection<Item> {
    void add(Item i);

    Item get(int index) throws IndexOutOfBoundsException; // These can be slow for LinkedList implementations
    void set(int index, Item value) throws IndexOutOfBoundsException;

    int capacity();
    int size(); // Capacity and size can be the same for LinkedList implementations
}

那么,我想要我的 ArrayVisualizer 类将实现此接口的任何类作为参数。我在谷歌上搜索了一下,发现你不会写字

public class ArrayVisualizer<T implements IterableCollection<?> >

但你必须使用扩展。
然而,即使我写了,我也不能在我的函数中使用t类。
例如,如果我尝试泛化此函数,则会出现编译器错误:

public static void draw(T<String> vector) throws Exception

就像我必须指定t也是泛型的,但是我找不到方法来声明它。我试过以下方法,但没有一种有效:

public class ArrayVisualizer<T<?> implements IterableCollection<?> >
public class ArrayVisualizer<T<S> implements IterableCollection<S> >

参考资料:我上传了代码的非通用版本作为参考。
动态播放.java
arrayvisualizer.java(它将一些空格字符串作为输入)
interactivearrayvisualizer.java(这个不允许选择单元格的值,但是您可以通过单击下一个空位来填充它们,也可以通过单击最后一个打开的单元格来清空它们。这意味着要使用调试助手来解决动态数组的调整大小问题。

nukf8bse

nukf8bse1#

你的 ArrayVisualizer 类必须同时指定集合类型和元素类型。你不能过多地量化 T<String> 就像在 java (其他语言可以做到,但java不行。)
所以,有点像。。。。

class ArrayVisualizer<E, T extends IterableCollection<E>> {
  public void draw(T vector) { ... }
}

(虽然如果我是你,我会尽量使用预建的 Iterable 或者 Collection 界面而不是我自己的 IterableCollection 接口…)

相关问题