2016-07-04 57 views
2

我想从用流利的语法基类继承的方法:流利的语法和继承

class BaseModel { 
     int count; 

     public BaseModel setCount(int value){ 
      this.count=value; 
      return this; 
     } 
} 


class FooModel extends BaseModel{ 
     int age; 

     public FooModel setAge(int value){ 
      this.age=value; 
      return this; 
     } 
} 

这段代码的问题是该行:

FooModel model= new FooModel().setCount(2).setAge(25); 

使编译器抱怨,因为方法返回类型为而不是FooModel

是否有某种方法在父类中声明该方法以便子类返回正确的类型而无需手动覆盖每个子类中的方法?

class FooModel extends BaseModel{ 
     int age; 

     public FooModel setAge(int value){ 
      this.age=value; 
      return this; 
     } 

     @Override 
     public FooModel setCount(int value){ 
      super.setCount(value); 
      return this; 
     } 
} 

感谢

+0

我想说的仿制药。 – Blackbelt

回答

3

好了,我看到的唯一方法是使用泛型:

class BaseModel<T> { 
    int count; 

    public T setCount(int value) { 
     this.count = value; 
     return (T) this; 
    } 
} 

class FooModel extends BaseModel<FooModel> { 
    int age; 

    public FooModel setAge(int value) { 
     this.age = value; 
     return this; 
    } 
} 

有了这个,你可以写你想要的代码片断

FooModel model = new FooModel().setCount(2).setAge(25); 
+0

这样你就可以有'class FooModel extends BaseModel '这是有效的,但是它并没有完成op所要求的 – Blackbelt

+0

@Blackbelt的确。没有考虑到这一点。 – TMichelsen

1

我将使用泛型,边界BaseModelT extends BaseModel<T>

class BaseModel<T extends BaseModel<T>> { 

这样你的类型T仍然要获得从BaseModel