我想知道是否可以编写一个接受多种泛型类型的函数,如下所示:
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?
发布于 2009-11-19 06:20:22
是的-这是可能的(尽管不是使用你的方法签名),是的,使用你的签名类型必须是相同的。
使用您提供的签名,T
必须与调用点的单个类型(例如,String
或 Integer
)相关联。但是,您可以声明接受多个类型参数的方法签名
public <S, T> void func(Set<S> s, Set<T> t)
请注意,在上面的签名中,我在签名本身中声明了S
和T
类型。因此,这些类型不同于任何与包含函数的类或接口相关联的泛型类型,并且独立于这些泛型类型。
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);
已经有很多问题了,所以你可以在这个主题上看看!
我不确定从函数中返回int
的意义是什么,但如果您愿意,也可以这样做!
发布于 2009-11-19 06:21:45
可以在一个类型或方法上声明多个类型变量。例如,在方法上使用类型参数:
<P, Q> int f(Set<P>, Set<Q>) {
return 0;
}
发布于 2013-08-08 17:13:58
此外,您还可以继承泛型:)
@SuppressWarnings("unchecked")
public <T extends Something<E>, E extends Enum<E> & SomethingAware> T getSomething(Class<T> clazz) {
return (T) somethingHolderMap.get(clazz);
}
https://stackoverflow.com/questions/1759549
复制相似问题