2011-10-29 92 views
0

我想在java中定義一個泛型類,它只能使用我所有共享相同基類的自定義數據類型來實例化。是否有可能在運行時不檢查數據類型?此外,我想禁止實例化一個泛型類而不提供數據類型。Java泛型只支持預定義的數據類型

編輯: 我爲我的C++庫編寫一個java包裝,因此java類應該只允許我的C++數據類型的包裝類作爲參數。我只是試圖用限制類型參數,如建議,但我仍然可以實例化一個像這樣的對象:

MyClass c = new MyClass(); 

這是基本的代碼:

public class MyClass<T extends MyType> 
{ 
    public MyClass() 
    { 

    } 

    public doSomething(MyOtherClass<T> other) 
    { 

    } 
} 
+0

查看下面的答案,我想這個問題可以用一些細節或例子。 –

+0

這不是一個泛型問題,它是關於繼承和多態性的。看看這些概念,然後查看它們在Java中的工作方式。 –

+0

public void myAddition(pizza a,pizza b){ \t \t int temp = 0; \t \t temp = a + b;

回答

2

你要找的是所謂Bounded Type Parameters

有可能是當你要限制各種被允許傳遞到一個類型參數的類型。例如,對數字進行操作的方法可能只想接受Number或其子類的實例。這是有界類型參數的用途。

public <U extends Number> void inspect(U u){ 
    System.out.println("T: " + t.getClass().getName()); 
    System.out.println("U: " + u.getClass().getName()); 
} 
1

如果你擔心別人創造他們自己的基類的子類並在泛型中使用它,唯一可以禁止的方法是控制對基類的擴展。

一種方法是使用默認可見性保護基類的構造函數,並將具體實現放在同一個類中。使那些具體的實現最終,或使他們的構造函數是私有的。

2

由於類型擦除 - 和向後兼容現在很老的要求 - 有沒有辦法需要一個類實例化與泛型類型參數。兩種解決方案:

  1. 注意警告。讓開發人員不會感到運行時異常的憤怒:-)
  2. 只允許通過擴展泛型類的類(並提供類型參數)進行訪問。例如,class MyClassFoo extends MyClass<Foo>,然後從外部代碼隱藏MyClass構造函數。

兩者都不是理想的,但它是它是什麼。 C++和.NET的工作方式都不相同,但是它們又是C++/.NET而不是Java :-)

快樂編碼。