泛型类中的泛型方法声明。边界允许不同的超级和没有它

时间:2014-03-09 08:23:37

标签: java generics methods

此方法声明有什么问题?

public abstract class A<K extends Number>{  
   public abstract <K> A<K> useMe (A<K> k);
}

我看到编译错误:

java: type argument K is not within bounds of type-variable K

我首先想到的是这个编译错误是因为 - 我的方法声明中不能保证K是Number,这就是为什么会出现问题。

但在另一个案例中如下:

public abstract <K> A<? extends Number> useMe (A<? super K> k);

A<? super K>再次无法保证它是Number(但IDE符号警告),但它不是编译错误。

有什么区别?

2 个答案:

答案 0 :(得分:1)

从类中删除extends numbers并使用方法添加它,即 public abstract class A<T>{ public abstract <T extends Number> A<T> useMe(A<T> t); }

答案 1 :(得分:0)

好的,这是一个不同的答案。 原因是虽然您在方法中使用<K>作为通用,但它与您在班级中使用的<K>无关。如果你写了

,那就更明显了
abstract class A<K extends Number>{
    public abstract <T> A<T> useMe(A<T> t);
}

此处<T>是一些通用的,但您有限制A仅使用扩展Number<T>的泛型,在这种情况下不会,并且它无法实现A的合同这是错误的来源。因此你应该写

abstract class A<K extends Number>{
    public abstract <T extends Number> A<T> useMe(A<T> k);
}