如何正确实现通配符参数?

时间:2015-04-16 14:08:43

标签: java generics wildcard

我正在尝试编写一个简单的泛型类Operations<T extends Number>,它有一个方法T sum()。它应该接受任何Number对象,并将其与T一起返回。我强烈怀疑我应该使用有界通配符参数,但我不知道如何继续。

interface OperationsInterface<T extends Number> {

    public T sum(Operations<? extends Number> v);

}

class Operations <T extends Number> 
    implements OperationsInterface<T> {

    private T o;

    public Operations(T o) {
        this.o = o;
    }

    @Override
    public T sum(Operations<? extends Number> v) {

    }

}

2 个答案:

答案 0 :(得分:1)

您甚至不需要:? extends Number作为方法参数的类型参数。 您的界面可以是这样的:

interface OperationsInterface<T extends Number> {

    public T sum(T... t);

}

因为你不能传递不是Number的子类的类型参数。

你的实现类就是这样,即:

class Operations implements OperationsInterface<Integer> {

    @Override
    public Integer sum(Integer... t) {
        // do sum
        return null;
    }

}

答案 1 :(得分:1)

如果您不想将参数绑定到T,那么您当然可以这样做

interface OperationsInterface<T extends Number> {

    public <N extends Number> T sum(Operations<N> v);

}

class Operations <T extends Number> 
    implements OperationsInterface<T> {

    private T o;

    public Operations(T o) {
        this.o = o;
    }

    @Override
    public <N extends Number> T sum(Operations<N> v) {

    }

}

看看它是否适合你。