2012-05-04 32 views
2

說允許的類型數量,我有一個泛型類型如下怎樣才能限制的Java泛型類型

public class GenericType<T> { 
    private T someVar; 

    public void setVar(T var) { this.someVar = var; } 

    //Rest of the code 
} 

我要讓它只需要特定類型(字符串/整數/雙人間)。我知道有限的通配符,但他們不幫我在這裏。在setVar()中,我可以檢查instanceof,如果type不是Integer/String等,則會拋出異常。這是執行此操作的最佳方法嗎?

我在做這種類型的操作時遇到同樣的問題。根據不同的類型,我想要做不同的操作。對於這種問題,繼承和有界通配符似乎是一般的走向,但這些都是原始包裝。

+0

對不起,我沒看到String類型 – DaTroop

+0

呀老兄你被卡住一個醜陋的解決方案有...有你的問題沒有直接漂亮的解決方案,因爲該類型是繼承無關...... – Thihara

回答

6

使用繼承:

Parent.java

public abstract class Parent<T> { 
    public abstract void display(T t); 
} 

ChildString.java

public class ChildString extends Parent<String> { 

    @Override 
    public void display(String t) { 
     // Do something here... 
    } 

} 

ChildInteger.java

public class ChildInteger extends Parent<Integer> { 

    @Override 
    public void display(Integer t) { 
     // Do something here... 
    } 

} 

ChildDouble.java

public class ChildDouble extends Parent<Double> { 

    @Override 
    public void display(Double t) { 
     // Do something here... 
    } 

} 

,並訪問類的孩子,而不是你直接訪問父類。

更新

這裏另外一個例子:

GenericType.java

public class GenericType { 

    public void display(Object t) { 
     String msg; 
     if(t instanceof String) { 
      msg = "String"; 
     } else if (t instanceof Integer) { 
      msg = "Integer"; 
     } else if (t instanceof Double) { 
      msg = "Double"; 
     } else { 
      msg = "Another Object"; 
     } 

     System.out.println(msg); 
    } 
} 

SpecificGeneric.java

public class SpecificGeneric { 

    public static void main(String[] args) { 
     GenericType basicType = new GenericType(); 

     basicType.display(new String()); 
     basicType.display(new Integer(1)); 
     basicType.display(new Double(0.1)); 
    } 
} 
+0

有效的答案,但爲了達到預期的效果,這不是太麻煩嗎?我的意思是你需要每個類型的兒童班。然後.. – Thihara

+0

是的,我同意你的意見。我只是根據提問者的需求給出例子。讓我舉另一個例子,而不使用繼承:-) – Crazenezz

+1

@Thihara:更新我的答案... – Crazenezz

0

你不能(不只是擴展了某些東西,但在你的情況下,你需要幾個不相關的類型,所以它沒有幫助)。

你可以,是檢查實例傳遞給方法(你已經知道它)。如果你想爲例如一個泛型類的實例。爲整數另一個字符串,但不允許例如。 Point2D,您可以使用參數Class clazz構造函數,並在構造時檢查它是否允許。 如果你更加偏執,你可以存儲該clazz,並在所有函數中比較參數是否屬於該類。

這樣,您仍然可以創建MyClass,但無法使用此類型創建實例。 (但你可以投它,它不是傻瓜證明)

0

推定所需的類型說GenericType<Double>和使用instanceof當neccesary是最快捷和最簡單的選擇。或者重載setVar(..)以接受Generic類中的受限類型。

public static class GenericType<T> 
    { 
    private T someVar; 
    public void setVar(String var) 
    { 
     this.someVar = (T) var; 
    } 

    public void setVar(Integer var) 
    { 
     this.someVar = (T) var; 
    } 

    public void setVar(Double var) 
    { 
     this.someVar = (T) var; 
    } 
    }