2016-10-20 73 views
0

我想從方法參數獲取實例或類名稱如下:如何從<T>類方法的參數實際類類型

public class Test { 

    public void getData (Class<T> type){ 
    // Class type of instance of "type" method argument. 
     if(type instanceOf SomeClass) { 
     //Do something 
     } 
    } 
} 

我已經嘗試過的通貨再膨脹的方法,如的getClass(),getSimpleClassName (),getName()等。這些都將類名稱返回爲「Class」,將實例返回爲「class java.lang.Class」。我需要它將實例與某個類進行比較,並進行必要的操作。

+2

'type == SomeClass.class' –

+2

爲什麼需要這些信息?這可能是一個[XY問題](http://mywiki.wooledge.org/XyProblem),當最好的解決方案是使用完全不同的方法時,如何解決特定的代碼問題。 –

+3

'類型instanceOf SomeClass'不能與類一起工作,請嘗試'SomeClass.class.isAssignableFrom(type)'。但是Hovercraft建議你應該退一步考慮你是否真的需要這個,或者是否有更好的解決方案(比較容易理解和維護,不易破碎等)。 – Thomas

回答

1

如果類型應該是完全一樣的(等於例如String.class和String.class那麼你可以使用==還是equals)

public class Test { 

    public void getData (Class<T> type){ 
    // Class type of instance of "type" method argument. 
     if(type.equals(SomeClass.class) { 
     //Do something 
     } 
    } 
} 

否則,如果類型是通過繼承如CharSequence的關係。 class和String.class你可以使用assignableFrom

public class Test { 

    public void getData (Class<T> type){ 
    // Class type of instance of "type" method argument. 
     if(SomeClass.class.isAssignableFrom(type) { 
     //Do something 
     } 
    } 
} 
-2

你只需要使用typeof函數。

Type t=typeof(T); 

謝謝。

+1

typeof不是java函數... instanceof是你的意思 – AxelH

2

你可以做type == SomeClass.class,但我覺得你的代碼有點

我會做:

  1. 介紹一個通用接口Abstract<T>與抽象public void getData()方法。

例如:

public interface Abstract<T> { 
    public void getData(); 
} 
  • 用於T每個有效類型參數(隨時與一些結合限制它),我會創建一個子類,其中getData()方法的執行將只是您代碼中相應的if塊的行爲:
  • 例如:

    public class SomeClassSpecific implements Abstract<SomeClass> { 
        public void getData() { 
         //specific implementation for SomeClass. 
        } 
    } 
    

    這樣你就帶着一幫小,易於檢驗的清潔班結束了,它的實施將覆蓋整個if-else體的getData(Class<T> clazz)方法。

    相關問題