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

具有流畅接口和继承的自绑定泛型类型

孙永嘉
2023-03-14
问题内容

我正在使用具有继承性的流畅接口。我html" target="_blank">声明基类Constructor受保护,因此您不能创建Foo
,这会导致在调用add()时引发ClassCastException。但是我在返回一个新的Foo实例的静态方法上遇到了麻烦。

public class Foo<T extends Foo<T>> // if i change to extends Foo i only get warnings
{
        public static Foo<Foo> createFoo() // <-- error
        {
                return new Foo<Foo>(); // <-- error
        }

        protected Foo() {}

        public T add()
        {
                //...
                return (T)this;
        }
}

public class Bar extends Foo<Bar>
{
        public Bar sub()
        {
                //...
                return this;
        }
}

这主要是流利的接口,特定领域的语言和泛型方面的一项练习(个人而非家庭作业),所以请不要问我需要什么。

编辑:Eclipse错误

Bound mismatch: The type Foo is not a valid substitute for the bounded parameter <T extends Foo<T>> of the type Foo<T>

问题答案:

本质上,您有一个递归类型声明。

Foo<T extends Foo<T>>

假设您有一个Foo<Foo>。这意味着T已映射到Foo。但是Foo不是的子类型Foo<T>,在这种情况下是Foo<Foo>,所以您真正要寻找的是Foo<Foo<Foo>>。但是请稍等,最里面Foo的没有被键入,所以我想是Foo<Foo<Foo<Foo>>>…哦,算了!

要在上面放一个更容易理解的面孔,请考虑是否有Foo<T extends List<T>>。您可以T在声明/实例化中使用Foo什么?
List<String>List<List>

编辑

您似乎找到了一种“打破”递归循环的方法。最终,您需要获得一种归类化的类型。以您发现ConcreteFoo对自己有用的方式相同,对于List上面的示例,您可以类似地使用某些类ConreteListOfItself implements List<ConreteListOfItself>来破坏递归循环。



 类似资料:
  • 我有2个抽象的类操纵泛型和一个工厂与泛型。父级独立于trips对象和因式分解代码。儿子只基于trips。 Eclipse上的AbstractTripBasedPurchaseExtractor第9行出现错误:Bound mismatch:类型TRIP_PURCHASE不是bounded参数的有效替代品 类型的 此处:extends AbstractPurchaseExtractor“ 在son类上

  • 为了在 .NET Core 中使用依赖关系注入,我们构建了一堆存储库接口,供控制器用于数据库交互。 我们有一个< code>EntityBase类,其中包含一些方法,我们的通用存储库接口使用这个基类,例如:< code>IRepository 我想添加一个更具体的 类,该类扩展了 ,以表示我们有一些要按标记筛选的实体。我希望 有一个抽象属性,我可以在控制器中使用该属性,以便我可以抽象出来并重用过滤

  • 问题内容: 我正在编写一个流畅的API,以配置和实例化一系列“消息”对象。我有消息类型的层次结构。 为了在使用Fluent API时能够访问子类的方法,我使用了泛型来对子类进行参数化,并使所有的fluent方法(以“ with”开头)都返回泛型类型。注意,我省略了流利方法的大部分内容。其中进行了许多配置。 具体的子类类似地重新定义泛型。 该代码有效,即,我可以实例化任何类并使用所有流利的方法: 以

  • 问题内容: 我有以下界面: 我在下面有抽象类(没有提到方法插入): 我有具体的课程: 最后,SpecificEntryBean定义为: 我有以下错误: 类型SpecificEntry必须实现继承的抽象方法SingleRecordInterface.insert(AbstractEntryBean) 考虑到SpecificEntryBean扩展了AbstractEntryBean,所以我不明白此错误

  • 我有一个父类和子类、和,它们描述了如何购买水果的不同类型。 在篮子里插入购买的特定水果; 计算购买水果的总价值; 计算用于给定类型水果(水果名称)的总金额 为了与其他项目的类兼容,在各个类中使用的执行要支付金额的计算的方法将具有名称payFruit,返回类型double并且没有参数。此方法必须在接口中声明。 注意:我知道这可能对我的情况很特殊,对其他人没有太大帮助,但我发现这个类层次结构在使用时有

  • 我有一个典型的问题,什么是更好的,我认为答案总是视情况而定,但我还是想澄清一下。所以有两种方法: 逻辑是: 我知道由于类型擦除,方法签名存在冲突,所以我的问题不是“为什么我不能同时拥有这两个方法?”,而是“你会选择哪种方法?”。