当前位置: 首页 > 面试题库 >

在泛型中将自身用作类型参数的用途是什么

云宾鸿
2023-03-14
问题内容

我看到了有关一个不相关问题的一些代码,但它使我感到好奇,因为我从未见过Java
Generics这样的构造。创建可以将自身或自身后代用作类型参数的泛型类的用途是什么。这是示例:

abstract class A<E extends A<E>> {
    abstract void foo(E x);
}

首先想到的是一个以列表为参数的列表。使用此代码感到很奇怪,如何声明A类型的变量?递归声明!

这还行吗?如果是这样,您在代码中看到过吗?如何使用?

编辑

确实,事实证明我的问题与这个问题相同,只是用不同的措词,但是该问题的答案也将回答我的问题。

也感谢您对“
反复出现的模板模式”的参考,该模板提供了一些历史背景和对该主题的进一步说明。

这个老博客条目可能会为我为我们的Java专家提供最好的全面解释。

现在很难在这里选择正确的答案,因为它们都对您有帮助,因此我将选择最终获得最多阅读材料的答案(上文参考)


问题答案:

泛型不仅用于列表之类的容器。这种“扩展自身”类型的参数用于让超类在方法参数和返回类型之类的地方引用子类,即使在编译超类时没有实际的特定子类可用。它类似于C++中反复出现的模板模式。

您的示例的子类将声明为

class Foo extends A<Foo>

html" target="_blank">继承的foo()方法变成

void foo(Foo x)

看看如何A定义一个Foo即使实际上并不了解参数也可以接受参数的方法Foo

是的,这种事情很罕见,但并非闻所未闻:内置的Enum类使用了类似的技巧。



 类似资料:
  • 我想使用泛型类作为另一个泛型类的类型参数。 起初,我对类的定义是这样的: 然后我的需求发生了变化,我不得不为我的R类型使用包装器/持有者类 到目前为止,我的尝试:(给出编译时错误:

  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 问题内容: 我尝试用泛型创建一个抽象类。业务逻辑是将文本从一种语言翻译成另一种语言。每种语言都必须有一个课程。对于每种语言,我还需要一个类,该类是方法的返回对象,它具有参数。T应该是(例如EnglishText,ChineseText等)的子类。那就是我奋斗的地方。您如何编码此约束? 我创建了以下超级类。 如果我误解了泛型的概念或将其错误地使用,请说明一下。谢谢。 问题答案: 只需将其添加到定义泛

  • 问题内容: 问题摘要: 我想将具有类型参数(例如)的类作为类型参数传递给泛型方法。 假设我有一个方法: 当然,此方法对于任何类型的类都可以正常使用。我可以这样调用该方法,例如: 问题: 我发现我不能这样做: 从句法上讲,这显然是无效的。但是,我不确定如何实现这样的目标。我当然可以通过,但是泛型类型的添加使其在语法上不再有效,并且我想不出解决方法。 唯一的直接解决方案是这样的事情(看起来很愚蠢):

  • 问题内容: 以下这部分代码是什么意思?我什至不知道这个语法叫什么。 这是原始代码(可从此处找到:http : //developer.android.com/guide/components/processes-and- threads.html ): 问题答案: 告诉AsyncTask使用3种不同的类型进行描述,当您使用AsyncTask时,将String作为第一个参数,将Void作为第二个参数