首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java泛型通配符

java泛型通配符
EN

Stack Overflow用户
提问于 2011-06-08 21:31:55
回答 5查看 1.4K关注 0票数 8

我有一个关于在Java泛型类型中使用通配符的问题:List<? extends Set>List<T extends Set>之间的基本区别是什么?我什么时候可以使用这两种方法?

EN

回答 5

Stack Overflow用户

发布于 2011-06-08 21:41:55

有两个原因:

避免不必要的强制转换的

对于这样的情况,您必须使用T变体:

代码语言:javascript
运行
复制
public <T extends Set> T firstOf(List<T> l) {
    return l.get(0);
}

对于?,这将变成:

代码语言:javascript
运行
复制
public Set firstOf2(List<? extends Set> l) {
    return l.get(0);
}

...which不会向firstOf方法的调用者提供相同数量的信息。第一个版本允许调用者这样做:

代码语言:javascript
运行
复制
SubSet first = firstOf(listOfSubSet);

而在第二个版本中,您必须使用强制转换来使其编译:

代码语言:javascript
运行
复制
SubSet first = (SubSet)firstOf(listOfSubSet);

强制匹配参数类型的

代码语言:javascript
运行
复制
public <T extends Set> boolean compareSets(List<T> a, List<T> b) {
    boolean same = true;
    for(T at : a) {
        for (T bt: b) {
             same &= at.equals(bt);
        }
    }
    return same;
}

对于这一点,使用?而不是T没有直接的等价物。请注意,由于Java的单分派,在上面的版本中,编译器将调用atequals(T)方法,该方法很可能与atequals(Set)equals(Object)方法不同。

票数 8
EN

Stack Overflow用户

发布于 2011-06-08 21:39:14

这里的不同之处在于,在第二个版本中,您有一个类型变量T,它引用List包含的Set的特定子类型。在需要确保其他类型与列表中包含的类型相同的情况下,需要使用它。下面是几个简单的例子:

代码语言:javascript
运行
复制
// want to ensure that the method returns the same type contained in the list
public <T extends Set> T something(List<T> list) {
  ...
}

// want to ensure both lists contain the exact same type
public <T extends Set> List<T> somethingElse(List<T> first, List<T> second) {
  ...
}

简单规则:如果在两个地方需要相同的类型,则在方法签名中使用类型变量T extends Foo。方法参数是一个地方,方法返回类型是另一个地方。如果您只需要确保在一个地方处理“某个东西是一个Foo”,请使用通配符? extends Foo

旁白:不要使用原始类型Set

票数 1
EN

Stack Overflow用户

发布于 2011-06-08 21:41:25

在声明varlable时使用List<? extends Set>。例如:

代码语言:javascript
运行
复制
List<? extends Number> l = new ArrayList<Integer>();

List<T extends Number>可以在类或方法声明中使用。这将允许您稍后在函数中编写T而不是<? extends Number>

代码语言:javascript
运行
复制
public <T extends Number> int addAll(List<T> list) {
    int result = 0;
    for (T t : list) {
        result += t.intValue();
    }
    return result;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6279516

复制
相关文章

相似问题

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