当前位置: 首页 > 知识库问答 >
问题:

Java泛型通配符:vs

子车峰
2023-03-14

这2个功能有什么区别?

static void gPrint(List<? extends Number> l) {
    for (Number n : l) {
        System.out.println(n);
    }
}

static <T extends Number> void gPrintA(List<T> l) {
    for (Number n : l) {
        System.out.println(n);
    }
}

我看到了相同的输出。

共有3个答案

陶原
2023-03-14

T是一种有界类型,即无论使用何种类型,都必须坚持扩展数字的特定类型,例如,如果将双精度类型传递给列表,则不能传递短精度类型,因为T是双精度类型,并且列表已经由该类型限定。相反,如果您使用<代码>通配符),您可以使用扩展数字的“任意”类型(将短的和双的添加到该列表中)。

师博
2023-03-14

不同之处在于使用通配符时不能引用T

你现在不是,所以“没有区别”,但下面是如何使用t来改变:

static <T extends Number> T getElement(List<T> l) {
    for (T t : l) {
        if (some condition)
            return t;
    }
    return null;
}

这将返回与传入内容相同的类型。例如,它们都将编译:

Integer x = getElement(integerList);
Float y = getElement(floatList);
穆鸿波
2023-03-14

在这种情况下没有区别,因为不再使用T。

声明T的原因是,您可以再次引用它,从而将两个参数类型或返回类型绑定在一起。

 类似资料:
  • 问题内容: 我对Java中的通用通配符有两个疑问: 和之间有什么区别? 什么是有界通配符,什么是无界通配符? 问题答案: 在你的第一个问题中,并且是有界通配符的示例。无限制的通配符看起来像,基本上就是<? extends Object>。宽松地表示泛型可以是任何类型。有界通配符(或)通过说它必须扩展特定类型(称为上限)或必须是特定类型的祖先(称为下限)来对类型进行限制。

  • 所以我在阅读泛型以重新熟悉这些概念,尤其是在涉及通配符的地方,因为我很少使用或遇到通配符。从我的阅读中,我不明白他们为什么使用通配符。下面是我经常遇到的一个例子。 你为什么不这样写: oracle网站上的另一个示例: 为什么这不是写成 我错过什么了吗?

  • 问题内容: 您好直接从Oracle http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html提供的Java教程中 我知道编译时的类型擦除。而且我也知道,一个类型(无界)将被Object取代。知道在编译时如何使用无界通配符进行编译吗?只是删除它,因为它是原始类型? 提前致谢。 问题答案: 假设我们有一个

  • 根据Joshua Bloch的“有效Java”一书,关于如何/何时在泛型中使用有界通配符有一个规则。这个规则就是PECS(productor-extends,Comsumer-Super)。当我研究以下示例时: 根据PECS规则,上述声明是错误的。但是我希望有一个的,并向这个传递一个。为什么不做呢? 为什么要始终使用关键字?为什么使用是错误的? 当然,这也代表了Comsumer的观点。为什么消费者

  • 我正在与Java8通配符泛型作斗争。 假设一个名为的泛型类(来自Core Java book) 是因为Java8编译器转换吗?超级经理反对,因此任何事情都是允许的?

  • 我有2个查询相关Java泛型 1)我对java泛型很陌生。我正在尝试转换通配符,如下所示: 我想从列表中找出对象的类型 2)我有以下方法: 那为什么我在试图调用复制(整数,浮点数)的时候会出现编译错误呢?这里怎么了?