【问题标题】:Java: Parameterised Data Types & Non-Concrete TypesJava:参数化数据类型和非具体类型
【发布时间】:2015-08-26 21:36:57
【问题描述】:

就泛型而言,参数化类型能否指定非具体类型,例如抽象类或接口?因此,例如,是否可以编写类似 ...

ArrayList< SomeInterfaceType > list = new ArrayList< SomeInterfaceType >();

...在使用通配符或有界通配符时也可以这样说吗?例如,如果我做了类似...

ArrayList< ? >

.. 或者类似 ...

public static void foo( ArrayList< ? extends SomeInterfaceType > ) { ... }

... 这些通配符是否能够同时接受具体和非具体类型?如果是,我假设在最后一个示例中,也可以让通配符采用抽象类或接口,并且仍然从 SomeInterfaceType“扩展”。

【问题讨论】:

  • 是的。不如自己试试看?
  • 感谢您的回答。实际上,我正在快速浏览一些编程材料,并认为以这种方式收到答案会更快。非常感谢。
  • @Jesper 你想把它变成一个“答案”,以便我可以接受它作为解决方案吗?我想给你功劳。

标签: java generics interface


【解决方案1】:

是的,您可以使用非具体类型(例如接口类型)作为参数化类型的类型参数。

一个简单的例子是RunnableListRunnable 是一个接口):

class MyTask implements Runnable { ... }

List<Runnable> tasks = new ArrayList<>();
tasks.add(new MyTask());

// Run all the tasks in the list
for (Runnable task : tasks) {
    task.run();
}

同样,它也适用于通配符。

【讨论】:

  • 值得注意的是使用List&lt;Runnable&gt;而不是ArrayList&lt;Runnable&gt;,并且钻石&lt;&gt;需要java 7+语言级别。
  • 谢谢你的例子,但是在这种情况下继承关系是不是不能识别?例如,如果我声明 ArrayList list = new ArrayList();然后我将无法执行 list.add(new Customer());那么上面的例子怎么可能添加 MyTask 对象来代替 Runnable 参数化类型呢?
  • @Grateful 是的,您可以将Customer 添加到ArrayList&lt;Object&gt;(试试看!)。
  • @Jesper 好吧,这扭曲了我目前对泛型的理解。关于public static void processData( ArrayList&lt; Object &gt; data ) { ... }这句话,我刚在一本书上看到“不存在参数化类型的继承。换句话说,即使CustomerObject的子类,这种关系也不适用于@987654333 @ 和&lt;Object&gt;。这是代表未知类型的问号变得方便的时候。这个说法似乎与你刚才告诉我的相矛盾。
  • @Jesper 请原谅我。我并不想变得粗鲁。我只是真的想确保我在读什么。任何详细说明将不胜感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
相关资源
最近更新 更多