我認爲你是在談論F-bounded types。我發現它們在兩個層次直接相關的情況下非常有用。想到的最明顯的例子是構建器模式,針對類的層次結構。在這種情況下,也可以使用建造者的層次結構。
一個例子可能提供一些線索。考慮下面的(非常刻板)層次:
public abstract class Human {
protected String name;
protected int age;
}
public class Woman extends Human {
protected String loveMovie;
}
public class Man extends Human {
protected String soccerTeam;
}
現在,我們要爲Man
和Woman
創造的建設者。我們可以爲每個實現一個構建器,複製設置name
和age
屬性的方法。但是,由於Man
和Woman
繼承自Human
,我們可以有一個抽象HumanBuilder
,並使我們的WomanBuilder
和ManBuilder
繼承它。這是F-bound類型派上用場的地方。
的Human
類及其HumanBuilder
一起,情況如下:
public abstract class Human {
protected String name;
protected int age;
public static abstract class HumanBuilder<H extends Human,
T extends HumanBuilder<H, T>> {
protected String name;
protected int age;
@SuppressWarnings("unchecked")
public T name(String name) {
this.name = name;
return (T) this;
}
@SuppressWarnings("unchecked")
public T age(int age) {
this.age = age;
return (T) this;
}
protected void fill(H human) {
human.name = this.name;
human.age = this.age;
}
protected abstract H create();
public final H build() {
H human = this.create();
this.fill(human);
return human;
}
}
}
這將是Woman
類,沿其WomanBuilder
:
public class Woman extends Human {
protected String loveMovie;
public static class WomanBuilder extends HumanBuilder<Woman, WomanBuilder> {
protected String loveMovie;
public WomanBuilder loveMovie(String loveMovie) {
this.loveMovie = loveMovie;
return this;
}
@Override
protected void fill(Woman woman) {
super.fill(woman);
woman.loveMovie = this.loveMovie;
}
@Override
protected Woman create() {
return new Woman();
}
}
}
最後,這裏的Man
類,連同其ManBuilder
:
public class Man extends Human {
protected String soccerTeam;
public static class ManBuilder extends HumanBuilder<Man, ManBuilder> {
protected String soccerTeam;
public ManBuilder soccerTeam(String soccerTeam) {
this.soccerTeam = soccerTeam;
return this;
}
@Override
protected void fill(Man man) {
super.fill(man);
man.soccerTeam = this.soccerTeam;
}
@Override
protected Man create() {
return new Man();
}
}
}
這種方法節約了相當多行代碼,特別是在現實世界使用情況。
正如預期的那樣,使用的建設者不需要任何鑄造:
採取有關的遞歸定義看[這個問題](http://stackoverflow.com/q/211143/4125191) 'Enum'。如果'getNewInstance'聲明'T'作爲它的返回類型 – RealSkeptic
http://stackoverflow.com/q/17099185/2158288 – ZhongYu