2013-09-26 51 views
0

我最近正在研究一些Android代碼(這應該是一個普通的Java問題 - 赦免雙關語 - 關於泛型和Java自動解析類型)。Java/Android自動解析泛型類型。要求瞭解分步指導以瞭解

這裏是我的代碼(基於Android的,但請創建一個Java特定版本如果需要)

class ViewFinder<T extends View> { 

    @SuppressWarnings("unchecked") 
    final static <T> T byId(View view, int resource) { 

     return (T) view.findViewById(resource); 


    } 

} 

這裏是有趣的位...

// Convert XML UI component definitions into the static View Holder object 

// Here is what we normally have to do for Android to convert the XML into a UI component 
holder.txtGroupName = (TextView) row.findViewById(R.id.txtGroupName); 

// This is what I can do with my ViewFinder class above!   
holder.txtGroupName = ViewFinder.byId(row, R.id.txtGroupName); 

// This is what I was EXPECTING to do with my ViewFinder class above!  
holder.txtGroupName = ViewFinder<TextView>.byId(row, R.id.txtGroupName); 

不知道Java(而不是Android)正在解決通用T類型爲TextView UI組件,但爲什麼和* 如何 *

我可以爲這裏發生的事情得到一個「播放」嗎?我希望能夠在下次編碼之前弄清楚這是否會發生。

+0

您正在使用什麼版本的Java? – cYrixmorten

+0

是的,我正在使用Java 7.但我仍然有點困惑。鑑於'ViewFinder'是'byId(...)'方法。這個怎麼用?我用調試器進行了檢查,但沒有足夠的細節來查看細節。我知道它是'Type Inference',但我想知道它是如何在非常好的水平上工作的 –

回答

1

我的猜測是,你正在運行的Java 7,一起來看看:http://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html

要劃傷是怎麼回事的表面:Java編譯器的部分任務是

  • 解析 - 粗略的語法檢查並構建抽象語法樹AST。
  • 除草 - 進一步檢查AST。
  • TypeValidation - 我認爲這就是魔術發生的地方,在這一點上,AST被驗證並且標記被添加到變量,表達式等的每個節點上.TypeValidation過程將Types添加到節點並確保它們是正確的。在Java 7推斷類型的時候,我假定這個階段被擴展爲在作業的右側自動添加類型,當然如果有效的話。當進入下一階段時,諸如 List<String> str = new ArrayList<>()的東西被翻譯爲List<String> str = new ArrayList<String>()
  • ...
  • 最後輸出Java Bytcode,作爲bonusinfo總是以0xCAFEBABE開頭。

希望這是有道理

+0

您的答案完整且正確。我期待着用我的手指跟隨它,但我認爲這不會在這種情況下起作用。 fyi,我完全理解了第3點結尾處的'鑽石'用法。我不太瞭解我的用法,但知道它的工作原理。 –

+0

很高興幫助。並且確實知道你瞭解鑽石,只是明確地展示了一個類型被編譯器自動替換爲鑽石的例子。我沒有介紹爲什麼部分,我認爲這只是語法糖。我不認爲我會使用這個功能,因爲1)已經嘗試從Java 7移動到6,很多重構2)在很多其他代碼中間領域的晚期分配,在這裏不清楚是什麼類型當你在2周後重新訪問代碼時,你只能看到鑽石。然後人們必須一直滾動到現場。 – cYrixmorten

+0

只是爲了闡明,在您的使用中,編譯器idd會自動將ViewFinder.byId轉換爲ViewFinder 。由於類型是從作業的左側進行的, – cYrixmorten