相关疑难解决方法(0)

什么是通用<?的真实例子?超级T>?

据我所知,它<? super T>代表任何超级类T(T任何级别的父类).但我真的很难想象这个通用绑定通配符的任何现实生活示例.

我明白了什么<? super T>意思,我看过这个方法:

public class Collections {
  public static <T> void copy(List<? super T> dest, List<? extends T> src) {
      for (int i = 0; i < src.size(); i++)
        dest.set(i, src.get(i));
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个真实生活用例的例子,可以使用这种结构,而不是解释它是什么.

java generics inheritance super

74
推荐指数
3
解决办法
4554
查看次数

为什么Arrays.fill()不再用于HashMap.clear()了?

我注意到在执行中有些奇怪HashMap.clear().这就是它在OpenJDK 7u40中的表现:

public void clear() {
    modCount++;
    Arrays.fill(table, null);
    size = 0;
}
Run Code Online (Sandbox Code Playgroud)

这就是OpenJDK 8u40的外观:

public void clear() {
    Node<K,V>[] tab;
    modCount++;
    if ((tab = table) != null && size > 0) {
        size = 0;
        for (int i = 0; i < tab.length; ++i)
            tab[i] = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道现在table为空地图可以为null,因此需要在局部变量中进​​行额外的检查和缓存.但为什么被Arrays.fill()for-loop取代?

似乎在此提交中引入了更改.不幸的是,我没有找到解释为什么普通for循环可能比更好Arrays.fill().它更快吗?还是更安全?

java arrays hashmap java-8

70
推荐指数
1
解决办法
4627
查看次数

<T extends Object&E> vs <T extends E>

java.util.Collections.max的签名如下所示:

public static <T extends Object&Comparable <?super T >> T max(Collection collection);

根据我的理解,它基本上意味着T必须是 java.lang.Objectjava.lang.Comparable <?超级T >>,

但是,由于每个java.lang.Comparable也是一个java.lang.Object,上面的签名和下面的签名有什么区别?:

public static <T extends Comparable <?super T >> T max(Collection collection);

java generics

29
推荐指数
1
解决办法
4471
查看次数

Collections.max()签名的实际使用

这是签名解释的Collections.max()后续问题,其中接受的答案并未涉及此通配符的实际原因.

max方法需要一个Collection<? extends T>,我无法想到这个通配符有用的实际案例.

我甚至通过通配符提到Oracle更有趣,它说明了这一点

通常,如果您的API只使用类型参数T作为参数,则其使用应该利用较低的有界通配符(?super T).相反,如果API仅返回T,您将通过使用上限有通配符(?extends T)为您的客户提供更大的灵活性.

但我仍然没有得到它.甚至Java Generics and Collections一书也没有说明这个通配符背后的原因.

这有实际用途吗?一个真实世界的用例会很棒.

java generics wildcard

9
推荐指数
2
解决办法
409
查看次数

可比接口声明

Comparable界面变得通用时,声明就变成了

interface Comparable<T>
Run Code Online (Sandbox Code Playgroud)

真的应该是这样的

interface Comparable<T extends Comparable<T>>
Run Code Online (Sandbox Code Playgroud)

T没有延伸是没有意义的,Comparable因为实现者必须确保这一点

a.compareTo(b)
Run Code Online (Sandbox Code Playgroud)

b.compareTo(a)
Run Code Online (Sandbox Code Playgroud)

总是有相反的迹象.

我一直认为获得声明"错误"的原因与生成现有界面的问题有关,但我无法解释它.

有没有人有任何见解?

java generics

9
推荐指数
1
解决办法
308
查看次数

最大元素 - 孙的答案VS我的

在阅读了Sun关于泛型的文档之后,我转到了http://docs.oracle.com/javase/tutorial/java/generics/QandE/generics-questions.html上的Q和E部分.

对于Q8 -

编写一个通用方法来查找列表[begin,end]范围内的最大元素.

我写的代码是:

private static <T extends Comparable<T>> T max(List<T> l, int i, int j) {
    List<T> sublist = l.subList(i, j);
    System.out.println("Sublist "+sublist);
    int c = 0;T max = null;
    for(T elem: sublist) {
        if(c == 0 || max.compareTo(elem) < 0) {
            max = elem;
        } ++c;
    }
    return max;
}
Run Code Online (Sandbox Code Playgroud)

而Sun的回答是:

public static <T extends Object & Comparable<? super T>>

    T max(List<? extends T> list, int begin, int end) {

    T maxElem = list.get(begin);

    for …
Run Code Online (Sandbox Code Playgroud)

java generics

5
推荐指数
1
解决办法
201
查看次数

标签 统计

java ×6

generics ×5

arrays ×1

hashmap ×1

inheritance ×1

java-8 ×1

super ×1

wildcard ×1