2012-10-29 53 views
5

当你雇用你可能有以下情形一口流利的做法:爪哇 - 继承流利的方法的返回类型返回事件类的类型,而不是父母的

public class Foo<T extends a>{ 

    public Foo<T> someMethod(){ 
      System.out.println("foo"); 
      return this; 
    } 

} 


public class Bar<T extends b> extends Foo<T> { 

     public Bar<T> barMethod(){ 

      System.out.println("bar"); 
      return this; 
     } 

} 


public class a{} 
public class b extends a{} 

流利接口的强度,你可以链方法调用,但同时酒吧继承的someMethod(),返回类型为富不酒吧,将打破链条如下:

new Bar<b>().someMethod().barMethod(); 

答案之一可能是添加@Overrides每一个继承的方法,这样有酒吧附加方法:

@Override 
public Bar<T> someMethod(){ 
      System.out.println("foo"); 
      return this; 
    } 

但是在大类和扩展的类层次结构中,这可以证明冗余的混乱吗?!是否有适当的返回类型给予流利的方法,从而每个继承它的类将返回一个特定类型的对象(这样我们就可以链接方法而不需要强制转换)?

我想:

 public <U extends Foo<T>> U someMethod(){ 
      System.out.println("foo"); 
      return this; 
    } 

要唉,都无济于事。我希望有人知道这个问题的简单和优雅的解决方案。该项目很大,因此如果可能的话,它需要可维护和可扩展。

非常感谢您在此场景中提供的任何帮助。

回答

5

你能做到这样的,如果你不介意未经检查的转换:

public class Foo<T, F extends Foo<T, F>> { 
    public F someMethod() { 
    System.out.println("foo"); 
    return (F) this; // <--- That's the unchecked cast! Tucked safely away. 
    } 
    public static void main(String[] args) { 
    new Bar<String>().someMethod().barMethod(); 
    } 
} 

class Bar<T> extends Foo<T, Bar<T>> { 
    public Bar<T> barMethod() { 
    System.out.println("bar"); 
    return this; 
    } 
} 

我个人禁用选中投对整个项目进行全球警告。

+0

但仍然有一个'铸造',OP不需要。我不知道为什么。嗯。但是这个演员比较好。它在一个地方。所以,OP应该可以。其他主帮助他。 ;) –

+1

@RohitJain看到我对上面的回答发表评论:这是一个可用性的事情,试图使它成为一个非常简单的lib,用于客户端包含在他们的项目中。 Marko Topolnik的解决方案虽然很有趣,但我还没有考虑过。看起来有些描述是不可避免的? – ComethTheNerd

+0

@MarkoTopolnik。是的,这就是为什么在我的评论结束时,我补充说,它是一个更好的演员,因为它在一个地方。:) –

1

你可以做的是定义barMethod方法摘要,所以现在你可以在Foo类型上调用它。

public abstract class Foo<T extends a> { 

    public Foo<T> someMethod() { 
     System.out.println("foo"); 
     return this; 
    } 

    public abstract Foo<T> barMethod(); 
} 

现在,您可以方便地调用

new Bar<b>().someMethod().barMethod(); 
+0

这种方法的问题是它阻止我们直接实例化Foo,我仍然需要这样做。 – ComethTheNerd

+0

@HodeCode。所以你不想添加抽象方法,你不想重写,而且你也不想强制转换。嗯。如果有办法,会很艰难。让我们看看是否有人可以提出解决方案。但是,如果你开发出所有的解决方法,我认为没有解决方法。但我仍然无法确定。 –

+0

然后你将不得不施放它。 –

相关问题