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

时间:2011-10-31 20:27:51

标签: java generics inheritance fluent-interface

我正在使用具有继承的流畅接口。我宣布基类构造函数受到保护,因此你无法创建一个Foo< Bar>调用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;
        }
}

这主要是Fluent Interfaces,Domain-specific language和Generics中的练习(个人而非家庭作业),所以请不要问我需要它。

编辑:Eclipse错误

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

1 个答案:

答案 0 :(得分:3)

你基本上有一个递归类型声明。

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>会破坏递归周期。