首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java泛型:多个泛型参数?

Java泛型:多个泛型参数?
EN

Stack Overflow用户
提问于 2009-11-19 06:17:48
回答 6查看 151.4K关注 0票数 77

我想知道是否可以编写一个接受多种泛型类型的函数,如下所示:

代码语言:javascript
运行
复制
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?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-11-19 06:20:22

是的-这是可能的(尽管不是使用你的方法签名),是的,使用你的签名类型必须是相同的。

使用您提供的签名,T必须与调用点的单个类型(例如,String Integer)相关联。但是,您可以声明接受多个类型参数的方法签名

代码语言:javascript
运行
复制
public <S, T> void func(Set<S> s, Set<T> t)

请注意,在上面的签名中,我在签名本身中声明了ST类型。因此,这些类型不同于任何与包含函数的类或接口相关联的泛型类型,并且独立于这些泛型类型。

代码语言:javascript
运行
复制
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>。在这种情况下,您将看到如下签名:

代码语言:javascript
运行
复制
public void baz(Set<? extends T> s);

已经有很多问题了,所以你可以在这个主题上看看!

我不确定从函数中返回int的意义是什么,但如果您愿意,也可以这样做!

票数 137
EN

Stack Overflow用户

发布于 2009-11-19 06:21:45

可以在一个类型或方法上声明多个类型变量。例如,在方法上使用类型参数:

代码语言:javascript
运行
复制
<P, Q> int f(Set<P>, Set<Q>) {
  return 0;
}
票数 10
EN

Stack Overflow用户

发布于 2013-08-08 17:13:58

此外,您还可以继承泛型:)

代码语言:javascript
运行
复制
@SuppressWarnings("unchecked")
public <T extends Something<E>, E extends Enum<E> & SomethingAware> T getSomething(Class<T> clazz) {
        return (T) somethingHolderMap.get(clazz);
    }
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1759549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档