![](/img/trans.png)
[英]Implementing Comparable interface for a generic class with Type parameter
[英]Cast interface with generic type parameter extending Comparable
我有一個非常簡單的帶有泛型類型參數的界面。
public interface Foo<T> {
void add(T element);
}
現在,我在像這樣的類中具有此接口的變量:
public class Bar {
private Foo<?> foo;
public void action() {
Object o = new Object();
(Foo<Object> foo).add(o); // in my case i know that this will work
}
}
但是現在,如果我修改接口,以便類型參數必須擴展Comparable<T>
,我如何實現與上述相同的效果?
public interface Foo<T extends Comparable<T>> {
void add(T element);
}
public class Bar {
private Foo<?> foo;
public void action() {
Object o = new Object();
// compiler error, since Object does not extent Comparable
(Foo<Object> foo).add(o);
}
}
更新:
我有很多實現此接口的類,例如:
public class IntFoo implements Foo<Integer> {
public void add(Integer element) {
// do something
}
}
在我的Bar
類中,我有一個Foo<?>
,我想使用add()
向其中添加元素。 我已經采取了預防措施(例如,使用instanceof
)僅在類型為Foo<Integer>
instanceof
添加一個Integer
。
要了解為什么您的方法不能按預期方式工作,必須首先了解所使用的通配符- ?
,以及有關泛型與強制轉換的背景知識。
帶通配符的泛型被視為“無關”或“未知”類型 ; 就是說,您既不知道也不關心該泛型中的類型,因為由於類型擦除,您以后無法檢索它。
引入泛型是為了避免麻煩或需要轉換為我們想要的特定類型。 我們可以定義一個同構類型,並簡單地處理它 ,而不必每次都強制轉換。 泛型使我們能夠處理由於編譯時轉換錯誤而導致的類型不匹配的情況 ,這意味着如果Java認為代碼轉換為錯誤類型,則代碼甚至都不會編譯。
由於強制類型轉換是開發人員篡改編譯器控件的唯一方法,因此如果您強制類型轉換,則是要告訴編譯器您知道自己在做什么。 如果不這樣做 ,則會得到運行時異常。
所有這些都可以說...
將任何Comparable
類型的元素添加到Bar
的唯一方法是,如果您具有類型化和綁定的泛型。
public class Bar<T extends Comparable<T>> implements Foo<T> {
private Foo<T> foo;
public void add(T object) {
foo.add(object);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.