[英]How to force type on return value in a generic class?
假設我有一個通用的 class:
public final class MyClass<T> {
private List<T> list;
public MyClass(){
}
}
兩個問題:
我也想強制用戶創建通用返回類型,這就是我創建通用 class 的原因,但顯然他可以這樣做:
MyClass item = new MyClass();
還有這個:
MyClass item = new MyClass<Customer>();
我想強制開發人員使用他們提供的相同類型來定義他們的返回類型,這樣他們就只能這樣做:
MyClass<Customer> item= new MyClass<Customer>();
這個 class 的目的是在構造函數中獲取一個類型,比方說 class Customer
,並創建該類型的通用列表,但由於返回 object 在應用程序層之間傳遞,我想強制它具有簽名MyClass<Customer>
因此很容易理解它包含的列表類型。
正如評論中已經提到的,出於向后兼容的原因,generics 不是強制的。
如果您要求類型 class 作為構造函數參數,您的開發人員將不得不考慮一個類型:
private static class MyClass<T> {
private List<T> list;
public MyClass(Class<T> clazz){
}
}
public static void main(String args[])
{
MyClass myclass=new MyClass(Object.class);
}
但如你所見,他們總能通過 Object:)
這個 class 的目的是在構造函數中獲取一個類型,比方說 class Customer,並創建該類型的通用列表......
不,作為MyClass
的開發者,您不需要這個。 您可以在代碼中安全地執行類似的操作(這與調用者是否使用原始MyClass
類型無關):
public final class MyClass<T> {
private List<T> list;
public MyClass(){
this.list = new ArrayList<>();
}
}
除了 Java 出於好的(和實際的)原因允許這樣做之外,您的類型參數不受限制只是表明您自己也不太關心(當使用MyClass
而不是MyClass<Something>
時,Java 默認使用Object
)。
但是,如果您要查找的是基於類型的動態行為,例如動態實例化元素,那么最好是從調用者那里獲取 class 實例本身:
public final class MyClass<T> {
private Class<T> type;
private List<T> list;
public MyClass(Class<T> type){
this.type = type;
this.list = new ArrayList<>();
}
//then use type to perform your dynamic behavior on the element type
}
這將迫使您的調用者發送一個類型,因此使他們使用原始類型幾乎毫無意義。 但是你也應該有這樣做的理由。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.