在定义泛型方法时,我们可以使用T.在下面的方法中,它将允许我们传递两个具有相同类型的列表.

public static <T> void methodList(List<T> t1, List<T> t2) {    
}

因此,在main()中,我们可以传递两个字符串列表,但不能传递一个字符串列表和一个整数列表.

public static void main(String[] args) {
    List<String> stringList = new ArrayList<>();
    List<String> stringList2 = new ArrayList<>();

    List<Integer> integerList = new ArrayList<>();

    methodList(stringList, stringList2); // correct
    methodList(stringList, integerList); // can't, reason: Incompatible equality constraint: Integer and String
}

这是我的问题.如果我们定义如下泛型方法,它将允许我们传递不同的类型.

public static <T> void method(T t1, T t2) {
}

public static void main(String[] args) {
    String s = "a";
    Integer num = 1;

    method(s, num); // correct
}

为什么在这种情况下没有第一个示例中的类型限制? 我们可以自己做吗,只允许将相同的类型传递给第二个方法?

推荐答案

为了使method(s, num);有效,只需要有一个类型T,使得IntegerString都可以转换为T.第Object章就是这样的人Java的类型推断算法也可以推断出这样的类型(尽管IIRC是IntegerString都实现的接口的某种交集类型).

然而,要使methodList(stringList, integerList)有效,需要有一个T,这样List<String>List<Integer>都可以转换为List<T>.There is no such type. Object在这里不起作用,因为List<String>List<Integer>不能转换为List<Object>(See also).Java的泛型默认为invariant.

如果通过说? extends T来使List的类型参数协变,那么methodList(stringList, integerList)就会编译.

<T> void methodList(List<? extends T> list1, List<? extends T> list2) {}

因为T可以是Object(或者Java实际推断的任何交集类型),并且List<String>List<Integer>都可以转换为List<? extends Object>.

Java相关问答推荐

是否有一种格式模式,可以在除0之外的数字前面有正负符号?

RDX触发ChoiceBox转换器(并按字符串值排序)

如果给定层次 struct 级别,如何从其预序穿越构造n元树

如何在Javascript中设置文本区域圆角的样式

为什么我们仍然需要实现noArgsConstructor如果Java默认提供一个非参数化的构造函数?''

使用标记时,场景大纲不在多个线程上运行

S的字符串表示是双重精确的吗?

只需最少的代码更改即可将版本号标记添加到日志(log)

我无法获取我的Java Spring应用程序的Logback跟踪日志(log)输出

JavaFX如何在MeshView中修复多个立方体?

Java Mooc.fi Part 12_01.Hideout -返回和删除方法

根本不显示JavaFX阿拉伯字母

从映射列表中检索所有键

使IntelliJ在导入时优先 Select 一个类或将另一个标记为错误

如何在Java中的重写方法参数中强制(Enum)接口实现?

将@Transactional添加到Spring框架中链下的每个方法会产生什么效果?

简化每个元素本身都是 map 列表的列表

java构造函数中的冻结操作何时发生?

如何在Java中正确实现填字游戏求解器

睡眠在 Spring Boot 中