【问题标题】:How to return generic methods?如何返回泛型方法?
【发布时间】:2019-09-22 04:55:26
【问题描述】:

我现在正在做作业,偶然发现了一个可能很简单的“问题”。

我要建栈,需要完成以下方法:

public E top()
    {   
        if(!isEmpty()) {
            /*
             * return top element
             * which would be st[pos-1]
             */
        }
        return null;
    }

我用

//to save elements
private Object[] st;

//for position in array
private int pos = 0;

我试图返回我的数组,但它告诉我“无法从 Object 转换为 E”。现在我不知道如何继续。

//编辑:我的构造函数

public Stack(int size)
    {
        st = new Object[size];
        //st = new E[size]; doesn't work

    }

【问题讨论】:

  • 几乎肯定不是你的老师想要你做的......但是你可以通过将Class<E> klass作为参数添加到你的构造函数来创建一个大小为sizeEs数组,并调用st = (E[]) java.lang.reflect.Array.newInstance(klass, size);

标签: java generics stack


【解决方案1】:

你的数组应该是 E 类型

private E[] st;

【讨论】:

  • 非常感谢!那么就没有别的办法了吗?因为我从我们老师那里得到了这样的代码,它只需要完成。现在我的构造函数正在苦苦挣扎,因为它无法“创建通用数组”。
  • 如果您这样做,您需要提供E[]Supplier<E[]> 作为构造函数参数,因为一般无法创建数组。
【解决方案2】:

你需要投射:

E element = (E) st[pos-1];

不过,您会收到未经检查的演员表警告。如果您确保仅将 E 的实例添加到数组中,则可以安全地禁止此操作。

void add(E element) {
  st[pos++] = element;
}

(这几乎就是 java.util.ArrayList 所做的,顺便说一句)

【讨论】:

    猜你喜欢
    • 2016-12-24
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多