gpt4 book ai didi

java - 类型参数的意义是什么?为什么我们需要在返回类型中添加它一次,然后在修饰符和返回类型之间添加它?

转载 作者:行者123 更新时间:2023-12-02 06:10:47 25 4
gpt4 key购买 nike

考虑这个取自 Effective Java: 的通用方法

  // Generic method
public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
Set<E> result = new HashSet<E>(s1);
result.addAll(s2);
return result;
}

此方法用于练习上面的通用方法:

// Simple program to exercise generic method
public static void main(String[] args) {
Set<String> guys = new HashSet<String>(
Arrays.asList("Tom", "Dick", "Harry"));
Set<String> stooges = new HashSet<String>(
Arrays.asList("Larry", "Moe", "Curly"));
Set<String> aflCio = union(guys, stooges); //What does the type parameter help here?
System.out.println(aflCio);
}

如果我们没有提供类型参数,即 <E>在修饰符和返回类型之间我们仍然不能分配引用 aflCio其类型为 Set<String> union 方法的返回值?这里给我们买的类型参数是什么?

我很难理解以下段落:

One noteworthy feature of generic methods is that you needn’t specify the value of the type parameter explicitly as you must when invoking generic con- structors. The compiler figures out the value of the type parameters by examining the types of the method arguments. In the case of the program above, the compiler sees that both arguments to union are of type Set, so it knows that the type parameter E must be String. This process is called type inference.

我们是否没有在返回类型中提及类型参数 Set<E> 。那么为什么我们需要再次添加它呢?

最佳答案

也许理解这一点的最简单方法是考虑替代方案。不使用generic method ,必须为 Set 选择一种合适的类型.

Object不是有效的选择,因为您不想收到 Set<Object>从你的方法 - 你不能将其分配给 Set<String> :

// Nope 
public static Set<Object> union(Set<Object> s1, Set<Object> s2) {
Set<Object> result = new HashSet<Object>(s1);
result.addAll(s2);
return result;
}

也不是通配符?类型合适。同样,您无法将其分配给 Set<String> .

相反,Java 定义了一种通用方法的语法,该方法正是针对这种情况而设计的。

public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
Set<E> result = new HashSet<E>(s1);
result.addAll(s2);
return result;
}

现在我们不关心 Set 中存储了什么类型,前提是两个输入中使用相同的类型。然后编译器知道返回类型将是 Set<String>如果输入是 Set<String> s。

关于java - 类型参数的意义是什么?为什么我们需要在返回类型中添加它一次,然后在修饰符和返回类型之间添加它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14999459/

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