我想知道在泛型類或方法中使用接口(或超類型)和使用泛型方法與邊界之間有什麼區別(T extends Interface )。在方法和類中使用泛型和接口有什麼區別
比方說,我有實現和接口(幼稚的例子)兩大類:
public interface MeasurableDistance {
public Point getPosition();
}
public class Person implements MeasurableDistance {
private Point position;
public Point getPosition() {
return position;
}
}
public class House implements MeasurableDistance {
private Point position;
public Point getPosition() {
return position;
}
}
1)會是怎樣通過以下方式編寫方法之間的區別:
public int computeDistance(MeasurableDistance a, MeasurableDistance b) {
Point a = a.getPosition();
Point b = b.getPosition();
//compute distance
return distance,
}
和類似的東西
public <T extends MeasurableDistance, S extends MeasurableDistance> int computeDistance(T a, S b) {
Point a = a.getPosition();
Point b = b.getPosition();
//compute distance
return distance,
}
2)如果我想要一個班舉行一個MeasurableDistanc Ë對象:
public class Holder {
private MeasurableDistance holder;
public Holder() {};
public add(MeasurableDistance a) {
holder = a;
}
}
或類似
public class Holder<T extends MeasurableDistance> {
private T holder;
public Holder<T>() {};
public add(T a) {
holder = a;
};
}
對1,我想他們應該是非常相同的,對不對?顯然調用非通用版本
Person a = new Person();
Person b = new Person();
House c = new House();
House d = new House();
computeDistance(a,c);
computeDistance(a,b);
computeDistance(c,d);
總是工作,因爲computeDistance()會看到這些對象是因爲多態性MeasurableDistance。通用版本應該工作得對嗎?編譯器會推斷MeasurableDistance類型並相應地添加轉換。即使我想打電話這樣說:
<Person, House>computeDistance(a,c);
將有同樣的效果,該方法看起來像
Point a = (MeasurableDistance) a.getPosition();
Point b = (MeasurableDistance) b.getPosition();
,如果我沒有記錯。或者,現在我想起它,它應該看起來像這樣:
Point a = (Person) a.getPosition();
Point b = (House) b.getPosition();
它會工作,因爲Person和House都在實現該方法。
那麼通用方法的優點是什麼?我讀過它是類型安全的,因爲強制轉換總是正確的,但是對於非泛型方法,您根本不會執行強制轉換。
1)在那裏使用泛型沒有意義。所有你需要的是一對'MeasurableDistance'實例。您可以使用泛型的唯一方法是如果您有一個與輸入相關的泛型參數(或泛型或非泛型返回)類型,例如'列表'。 –
@JornVernee謝謝你,修好了! – Paul
@AndyTurner你可以擴展你的評論嗎?第二部分尤其如此。謝謝! – Paul