相关疑难解决方法(0)

何时使用通用方法以及何时使用通配符?

我正在阅读OracleDocGenericMethod中的泛型方法.当它说何时使用通配符以及何时使用通用方法时,我对比较感到非常困惑.引用文件.

interface Collection<E> {
    public boolean containsAll(Collection<?> c);
    public boolean addAll(Collection<? extends E> c);
}
Run Code Online (Sandbox Code Playgroud)

我们可以在这里使用泛型方法:

interface Collection<E> {
    public <T> boolean containsAll(Collection<T> c);
    public <T extends E> boolean addAll(Collection<T> c);
    // Hey, type variables can have bounds too!
}
Run Code Online (Sandbox Code Playgroud)

[...]这告诉我们类型参数被用于多态; 它唯一的作用是允许在不同的调用站点使用各种实际的参数类型.如果是这种情况,则应使用通配符.通配符旨在支持灵活的子类型,这是我们在此尝试表达的内容.

难道我们不认为外卡(Collection<? extends E> c);也支持那种多态?那为什么泛型方法的使用被认为不好呢?

继续向前,它说,

通用方法允许使用类型参数来表示方法和/或其返回类型的一个或多个参数的类型之间的依赖关系.如果没有这种依赖关系,则不应使用通用方法.

这是什么意思?

他们提出了这个例子

class Collections {
    public static <T> void copy(List<T> dest, List<? extends T> src) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

[...]

我们可以用另一种方式为这种方法编写签名,而不使用通配符:

class Collections {
    public static <T, S extends …
Run Code Online (Sandbox Code Playgroud)

java generics wildcard

115
推荐指数
3
解决办法
5万
查看次数

在Java中展示协方差和逆变?

请给出Java中协方差和逆变的一个很好的例子.

java covariance contravariance

100
推荐指数
2
解决办法
4万
查看次数

Java通用列表<List <?扩展数>>

为什么java中我们做不到:

List<List<? extends Number>> aList = new ArrayList<List<Number>>();
Run Code Online (Sandbox Code Playgroud)

即使这样也可以:

List<? extends Number> aList = new ArrayList<Number>();
Run Code Online (Sandbox Code Playgroud)

编译器错误消息是:

Type mismatch: cannot convert from ArrayList<List<Number>> to List<List<? extends Number>>

java generics

39
推荐指数
2
解决办法
2万
查看次数

区别?(通配符)和Java中的Type参数

有人可以解释一下这两种方法之间的区别吗?它们一样吗?就他们解决的问题而言,他们看起来与我相同.如果它们相同,为什么需要?

方法#1,无界限

public static void printList(List<?> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}
Run Code Online (Sandbox Code Playgroud)

方法#2,无界:

public static <T> void printList(List<T> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}
Run Code Online (Sandbox Code Playgroud)

方法#1,有界

public static void printList(List<? extends Number> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}
Run Code Online (Sandbox Code Playgroud)

方法#2,有界:

public static <T extends Number> void printList(List<T> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println(); …
Run Code Online (Sandbox Code Playgroud)

java generics

27
推荐指数
3
解决办法
6622
查看次数

Java Generic类型:List <?之间的区别 extends Number>和List <T extends Number>

Java Generic类型:有什么区别

(1) List <? extends Number>   
(2) List <T extends Number>
Run Code Online (Sandbox Code Playgroud)

按照我的理解

(1)List <? extends Number> 是具有超类"数字"的"未知"数据类型的只读列表.我们只能读取元素但不能添加

(2)List <T extends Number> 超级"数字"的数据类型列表.我们可以读取元素并将其添加到列表中

请参阅下面的代码示例

class TestGen{

    public static void main(String[] args) {
        double result = 0.0;

        List<Integer> intList = new ArrayList<Integer>();
        intList.add(10);
        intList.add(20);
        intList.add(30);

        result = TestGen.sumOfList1(intList);
        System.out.println("Result=" + result);
        result = TestGen.sumOfList2(intList);
        System.out.println("Result=" + result);
    }

    public static double sumOfList1(List<? extends Number> list) {
        double s = 0.0;
        for (Number n : list) …
Run Code Online (Sandbox Code Playgroud)

java

23
推荐指数
2
解决办法
1万
查看次数

标签 统计

java ×5

generics ×3

contravariance ×1

covariance ×1

wildcard ×1