假设我正在尝试编写一个函数来返回当前类型的实例.有没有办法T引用确切的子类型(所以T应该B在课堂上引用B)?
class A {
<T extends A> foo();
}
class B extends A {
@Override
T foo();
}
Run Code Online (Sandbox Code Playgroud) 我正在使用一个流畅的继承接口.我声明基类Constructor受到保护,所以你不能创建一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
这主要是Fluent Interfaces,Domain-specific language和Generics中的练习(个人而不是家庭作业),所以请不要问我需要它.
编辑:Eclipse错误
Bound mismatch: The type Foo is not a valid substitute for the bounded parameter <T …Run Code Online (Sandbox Code Playgroud) 我试图在java中创建两个相互包含的类之间的泛型关系.这些对象基本上形成一个alernating层树.到目前为止,我发现最接近的SO问题是:泛型的Java泛型,它对我的问题很接近并且有些帮助,但仍然不同,我想要额外的指导.这是情况,或者更确切地说,我希望它是什么:
abstract class Group<I extends Item<Group<I>>>{
private List<I> items;
public List<I> getItems(){...}
public void setItems(List<I> items){...}
}
abstract class Item<G extends Group<Item<G>>>{
private List<G> subGroups;
public List<G> getSubGroups(){...}
public void setSubGroups(List<G> subGroups){...}
}
Run Code Online (Sandbox Code Playgroud)
除了吸气剂和制定者之外,该类的某些方面使它们彼此明显不同,但包含应该遵循这样的方式.这背后的原因是我想强制执行,如果我有实现类,他们必须表现如下:
class AGroup extends Group<AItem>{...} //works
class AItem extends Item<AGroup>{...} //works
class BGroup extends Group<BItem>{...} //works
class BItem extends Item<BGroup>{...} //works
class MixedGroup extends Group<AItem>{...} //fails since AItem does
//not extend Item<MixedGroup>
Run Code Online (Sandbox Code Playgroud)
到目前为止,编译器很好用
abstract class Group<I extends Item<Group<I>>>{
private List<I> items;
public List<I> getItems(){...}
public …Run Code Online (Sandbox Code Playgroud) 我正在努力做一些事情:
public interface Player<R>
{
R takeTurn(Game game);
}
Run Code Online (Sandbox Code Playgroud)
和
public interface Game
{
}
public class XPlayer
implements Player<Interger>
{
// XGame won't work because the interface takes Game
public Integer takeTurn(final XGame game)
{
return (null);
}
}
public class XGame
{
}
Run Code Online (Sandbox Code Playgroud)
我所坚持的是我需要在游戏和播放器界面中进行哪些更改以使泛型工作(我已经暂停了,而我脑子里还有一些头发:-)特别是我挂了玩家需要的地方知道游戏的类型,游戏需要知道玩家的类型.