我想知道是否可以编写一个接受多种泛型类型的函数,如下所示:
public int void myfunction(Set<T> a, Set<T> b) {
return 5;
}
Set<Integer> setA = new HashSet<Integer>();
Set<String> setB = new HashSet<String>();
int result = myfunction(setA, setB);
这行得通吗?每个参数中的泛型是否意味着每个参数必须具有与泛型相同的类型 T?
最佳答案
是的 - 有可能(尽管不是您的方法签名),是的,您的签名类型必须相同。
用你给的签名,T
必须与调用站点的单一类型(例如 String
或 Integer
)相关联。但是,您可以声明采用多个类型参数的方法签名
public <S, T> void func(Set<S> s, Set<T> t)
请注意,在上面的签名中,我声明了类型 S
和 T
在签名本身。因此,它们与与包含该函数的类或接口(interface)相关联的任何泛型类型不同且独立。
public class MyClass<S, T> {
public void foo(Set<S> s, Set<T> t); //same type params as on class
public <U, V> void bar(Set<U> s, Set<V> t); //type params independent of class
}
您可能想看看 java.util
中集合类的一些方法签名。包裹。泛型确实是一个相当复杂的主题,尤其是在考虑通配符( ? extends
和 ? super
)时。例如,通常情况下,可能采用 Set<Number>
的方法作为参数还应该接受 Set<Integer>
.在这种情况下,您会看到这样的签名:
public void baz(Set<? extends T> s);
已经有很多关于 SO 的问题供您查看!
- Java Generics: List, List<Object>, List<?>
- Java Generics (Wildcards)
- What are the differences between Generics in C# and Java... and Templates in C++?
不确定返回 int
的意义何在从功能上看,虽然你可以这样做!
关于Java 泛型 : multiple generic parameters?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1759549/