【问题标题】:generic method declaration within generic class. Boundaries allowing different for super and without it泛型类中的泛型方法声明。边界允许不同的超级和没有它
【发布时间】:2014-03-09 08:23:37
【问题描述】:

这个方法声明有什么问题?

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 是数字,这就是问题出现的原因。

但另一种情况如下:

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

A&lt;? super K&gt; 再次不能保证它是数字(但是 IDE 标志警告)但它不是编译错误。

有什么区别?

【问题讨论】:

  • 这对我来说也是相当令人惊讶的。我希望该签名会失败。仅供参考,如果我将A&lt;? super K&gt; 更改为A&lt;? super Object&gt;,其中ObjectK 的擦除,则编译失败。寻找一些可以很好解释的答案。
  • 但是我的 IDE 说是编译错误,但是手动完成后我没有看到编译错误
  • @RohitJain 您使用的是哪个编译器? A&lt;? super Object&gt; 作为参数类型对我来说使用源级别为 1.7 和 1.8 的 javac 和 Eclipse 编译器编译得很好。
  • @ErwinBolwidt 在 JDK 1.8.0 - build 129 下对我不起作用。在源代码级别为 1.8 的 Eclipse 中也没有
  • @gstackoverflow 似乎我的概念推导有点错误。这是same question posted on SO,其中提到Java 可能不使用下界通配符进行边界检查。你可能想看看。

标签: java generics methods


【解决方案1】:

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

【讨论】:

  • 从类上的&lt;T extends Number&gt; 中删除extends Number 会更改类声明的含义。是的,它可能使它编译,但现在它意味着不同的东西。
  • @Karsan 我应该看到什么?
  • 使用这个公共抽象类 A{ public abstract A useMe(A k); }
【解决方案2】:

好的,这是一个不同的答案。 原因是尽管您在方法中使用&lt;K&gt; 作为泛型,但它与您在课堂上使用的&lt;K&gt; 无关。如果你写会更明显

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

这里&lt;T&gt; 是一些泛型,但是你限制A 只使用扩展Number&lt;T&gt; 的泛型在这种情况下没有并且它无法实现A 的合同。这是错误的地方来自。因此你应该写

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

【讨论】:

  • 不,我想了解问题的原因。我只是研究泛型
  • @gstackoverflow,给出了不同的答案
  • 我不明白为什么public abstract A extends Number> useMe (A super K> k); 在这种情况下有效?
  • 你完全错过了这个问题。 OP 理解为什么第一个案例无法编译。他要问的是,为什么第二个案例编译得很好?这对我来说也是相当令人惊讶的。
  • @ErwinBolwidt 您在答案中在哪里看到对第二种情况的解释 - public abstract &lt;K&gt; A&lt;? extends Number&gt; useMe (A&lt;? super K&gt; k);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多