相关疑难解决方法(0)

键入参数vs无界通配符

从Effective Java第5章(泛型):

// Two possible declarations for the swap method
public static <E> void swap(List<E> list, int i, int j);
public static void swap(List<?> list, int i, int j);
Run Code Online (Sandbox Code Playgroud)

这两个声明中的哪一个更可取,为什么?在公共API中,第二个更好,因为它更简单.您传入一个列表 - 任何列表 - 并且该方法交换索引元素.没有类型参数需要担心.通常,如果类型参数在方法声明中仅出现一次,请将其替换为通配符.

我不明白为什么第二个选项对我的API客户来说更简单?我可以将相同的参数传递给第一和第二种方法.第二个需要辅助方法来进行通配符捕获.有人可以解释为什么推荐第二个?谢谢!

java generics

10
推荐指数
1
解决办法
1063
查看次数

Java Generics - 方法签名的上限

我有一个方法,我想接受必须扩展抽象类的类类型.有什么区别

<T extends AbstractClass> void myMethod(Class<T> clazz);

void myMethod(Class<? extends AbstractClass> clazz);

在第二种情况下,我无法直接引用方法内部的类型.可以将哪些类类型传递给这两种方法有什么区别吗?

java generics

7
推荐指数
1
解决办法
158
查看次数

有什么用?在java中

我想知道使用的?在java泛型中.通过研究占位符T和通配符?,我想知道?,经历了几个网站/页面和书籍,但没有理解它.所以我创建了下面的课来研究差异.

import java.util.List;

public class Generics2 {

    public <T> void method1(List<T> list){
        System.out.println(list);
    }

    public <T extends Number> void method2(List<T> list){
        System.out.println(list);
    }

    /*public <T super Integer> void method3(List<T> list){

    }*///super does not work.

    public void method4(List<?> list){
        System.out.println(list);
    }

    public void method5(List<? extends Number> list){
        System.out.println(list);
    }

    public void method6(List<? super Integer> list){
        System.out.println(list);
    }

    public <T> void copy1(List<T> list1, List<T> list2){
        //copy elements from list1 to list2

    }//It does not span well with copy of one type of …
Run Code Online (Sandbox Code Playgroud)

java generics

6
推荐指数
1
解决办法
216
查看次数

标签 统计

generics ×3

java ×3