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

Java泛型为什么需要通配符(问号)?[重复]

郑卜鹰
2023-03-14

我试图理解为什么我们需要通配符——Java泛型中的问号,为什么我们不能使用普通的单字符t或E等作为类型?请看以下示例:

public class App {

public static void main(String[] args) {
    App a = new App();
    List<String> strList = new ArrayList<String>();
    strList.add("Hello");
    strList.add("World");
    List<Integer> intList = new ArrayList<Integer>();
    intList.add(1);
    intList.add(2);
    intList.add(3);

    a.firstPrint(strList);
    a.firstPrint(intList);

    a.secondPrint(strList);
    a.secondPrint(intList);
}

public <T extends Object> void firstPrint(List<T> theList) {
    System.out.println(theList.toString());
}

public void secondPrint(List<? extends Object> theList) {
    System.out.println(theList.toString());
}

}

结果是一样的,尽管通配符版本更简洁。这是唯一的好处吗?

共有1个答案

陈飞语
2023-03-14

那个“?”是一个占位符,你可以通过不同类型的物体。

通常情况下,T和?在泛型中用作占位符。i、 e

用例:

示例:List

也就是说,假设类A可以为不同的实例具有相同的字段。然而,有一个字段可以随实例的类型而变化。同时,使用泛型可能是更好的方法

例子:

public Class A<T> {

   private T genericInstance;

   private String commonFields;

   public T getGenericInstance() {
      return this.genericInstance;
   }

   public String getCommonFields() {
      return this.commonFields;
   }

   public static void main(String args[]) {

      A<String> stringInstance = new A<>(); // In this case, 
      stringInstance.getGenericInstance();  // it will return a String instance as we used T as String.

      A<Custom> customObject = new A<>();   // In this case, 
      customObject.getGenericInstance();    // it will return a custom object instance as we used T as Custom class.
   }
}

 类似资料:
  • 为什么需要泛型 前言 泛型程序最早出现1970年代的CLU和Ada语言中, 后来被许多机遇对象和面向对象的语言锁采用 1993年C++在3.0版本中引入的模板技术就属于泛型编程 1994年7月ANSI/ISO C++标准委员会通过的STL更是泛型编程的集大成者, 它已被纳入1998年9月C++标准之中. 2004年9月Java在J2SE 5.0(JDK 1.5)中开始使用泛型技术; 2005年11

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

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

  • 我正在学习java通用编程。我在核心Java(第9版)中看到了这些图表: 我在Java编程综合版第十版简介中看到了这些图表: 但我相信应该是这样的: 有人能告诉我我是否正确吗?

  • 这2个功能有什么区别? 我看到了相同的输出。

  • null 我理解Mono是一个由0或1个元素组成的流和Flux是一个由0或N个元素组成的流之间的区别。 既然Mono和Flush都在实现,为什么我们需要这两种类型,为什么不对所有内容都使用Flux呢?