gpt4 book ai didi

java - 为泛型方法捕获通配符类型的私有(private)辅助方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:47:42 24 4
gpt4 key购买 nike

以下代码无法在 Eclipse 中编译。它说“类型 Abc 中的方法 putHelper(List,int,E) 不适用于参数 (List <.capture#8-of extends E>”,int,E)”

private <E> void putHelper(List<E> list, int i, E value) {
list.set(i, value);
}

public <E> void put(List<? extends E> list, int toPos, E value) {
// list.set(toPos,value);
putHelper(list, toPos, value);
}

我不明白为什么会这样?因为下面的代码工作正常。

  public <E> void put(List<? extends E> list,int fromPos, int toPos) {
putHelper(list,fromPos,toPos);
}

private <E> void putHelper(List<E> list,int i, int j) {
list.set(j,list.get(i));
}

而且我知道这里的辅助方法可以捕获通配符类型,但为什么在前面的代码中不能呢?

编辑:在第三种情况下,如果我将 put 方法中的类型参数更改为 List<.? super E> 并且当我尝试从另一个采用列表的方法调用 put() 方法时,Eclipse 不会编译它。它说,“Abc 类型中的方法 put(List<.? super E>,int,E) 不适用于参数 (List <.capture#6-of extends E>”,int,E)”

public static <E> void insertAndProcess(List<? extends E> list) {

// Iterate through the list for some range of values i to j

E value = list.get(i);

//Process the element and put it back at some index

put(list, i+1, value);

//Repeat the same for few more elements
}

private static <E> void putHelper(List<E> list, int i, E value) {
list.set(i, value);
}

public static <E> void put(List<? super E> list, int toPos, E value) {
putHelper(list, toPos, value);
}

在这里,insertAndProcess() 如何调用 put() 方法并在其实现中使用它,而用户仍然可以使用 ArrayList<.Integer> 调用这两个方法?

最佳答案

这是因为 Get and Put Principle 也以首字母缩略词 PECS 为人所知,它代表 Producer Extends,Consumer Super。

这在这个 SO 问题中有解释:What is PECS (Producer Extends Consumer Super)?

但基本上:

public <E> void put(List<? extends E> list, int toPos, E value) {
// list.set(toPos,value);
putHelper(list, toPos, value);
}

<? extends E>不能在这里使用,因为 List被用作消费者(它正在获取元素)所以它应该使用 super而不是 extends .

public <E> void put(List<? super E> list, int toPos, E value) {
// list.set(toPos,value);
putHelper(list, toPos, value);
}

编辑

在你的第二种情况下,List正在充当生产者,因为它通过调用 get() 来生产元素所以你可以使用 extends .

但是,在您的第三个示例中,您同时获取和放入同一个列表,所以我认为您根本不能使用通配符。

编译:

public static <E> void insertAndProcess(List<E> list) {

// Iterate through the list for some range of values i to j
E value = list.get(i);

// Process the element and put it back at some index
putHelper(list, i+1, value);

// Repeat the same for few more elements
}

请注意,因为我们不需要使用任何通配符,因为我们从同一个列表中获取和设置,所以类型 E无论是什么都必须相同。

关于java - 为泛型方法捕获通配符类型的私有(private)辅助方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24379283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com