【问题标题】:Wildcard parameter in method方法中的通配符参数
【发布时间】:2013-12-15 12:09:28
【问题描述】:

我定义了以下类:

 public class priorityQueue<T extends Comparable<T>> implements Iterable<T> 

它包含以下方法:

  • 公共布尔推送(T 节点)
  • 公共 T Pop()
  • 公共迭代器iterator()

我需要编写一个将元素从集合复制到优先队列的方法

public static<T>  void copy(Collection<T> source, priorityQueue<? extends Comparable<T>> dest) { 
    for(T elem:source){
        dest.Push(elem);
    }

}

我得到错误:

The method Push(capture#1-of ? extends Comparable<T>) in the type priorityQueue<capture#1-of ? extends Comparable<T>> is not applicable for the arguments (T)

为什么我不能写方法:

public static<T>  void copy(Collection<T> source, priorityQueue<T extends Comparable<T>> dest) 

我得到错误:

Syntax error on token "extends",, expected

如何声明复制元素的方法?

【问题讨论】:

  • 按照 Java 类名的约定以大写开头(因此优先队列将是选择),方法名以小写开头,因此方法 Push 应该是 push。
  • 我不使用 Java.util 中的方法,也不想覆盖它们,我已经用自己的方法定义了自己的 priorityQueue。
  • 如果您有不同的包位置,您不会使用相同的名称覆盖 PriorityQueue。此外,更喜欢使用与标准库中不同的名称,例如 MyPriorityQueue。任何阅读代码的人,包括你以后都会欣赏这一点。

标签: java wildcard generic-method


【解决方案1】:

因为T 已经在那个时候定义了,所以试试这个

public static<T extends Comparable<T>> 
 void copy(Collection<T> source, priorityQueue<T> dest) {}

【讨论】:

    【解决方案2】:

    您试图在静态方法中使用未定义类型的通配符。由于是静态的,类的通配符定义无效,需要在方法中指定。

    添加另一个通配符,所以方法结束如下:

    public static<T, P extends PriorityQueue<Comparable<T>>>  void copy(Collection<T> source, P dest) { 
        for(T elem:source){
            dest.Push(elem);
        }
    }
    

    【讨论】:

    • 你试过了吗?它不会编译。
    • 是的,我确实尝试过,是的,它确实可以编译。我最近使用了几次。我还注意到,这对于 OP 的要求来说太过分了,@Elliot Frisch 的答案要简单得多(包括我忘记的“扩展 Comparable”)。
    • 我看不出你的方法是如何编译的。 Ppush 方法需要 Comparable&lt;T&gt;,而您只是从 Collection&lt;T&gt; 推送元素,其中 T 没有任何界限。
    猜你喜欢
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    相关资源
    最近更新 更多