[英]Can a language be “complete” without explicit type casting?
在沒有顯式強制轉換的情況下,編程語言是否可以“完整”? 本質上,使用缺少顯式類型轉換的語言我們有什么不能做的?
例如, 下面的文章演示Java需要顯式類型轉換來編寫自定義的泛型類型類。
還有其他絕對需要顯式強制轉換的示例用例嗎?
這里有一些
要逆轉自動基元加寬:
byte blammy = (byte)(schmarr & 0xF7);
舊版代碼:
public void oldSchoolMethod(List oldSchoolListOfStrings)
{
String firstValue = (String)oldSchoolListOfStrings.get(0);
}
HTTP代碼:
public String getSchmarr(HttpServletRequest request)
{
HttpSession session = request.getSession();
return (String)session.getAttribute("Schmarr");
}
編輯:“類型增加”更正為“原始擴大”。
當然,以equals
方法為例-它必須為Object
獲取參數。 (並閱讀Effective Java關於平等和朋友的偉大章節 )
在Java中,無法聲明通用類型T
的數組。 例如,使用new T[10]
聲明數組是無效的:
public class List<T> {
T[] backing_array = new T[10]; // this line is invalid,
public T Item(int index) {
return backing_array[index]; // and therefore this line is invalid as well.
}
//etc...
我們擁有的最佳替代解決方案是:
public class List<T> {
Object[] backing_array = new Object[10];
public T Item(int index) {
return (T) backing_array[index]; // notice that a cast is needed here if we want the return type of this function to be T
}
//etc...
如果Java中不存在顯式類型轉換,則將無法構建通用數組列表,因為不允許聲明通用類型T
的數組。
在處理不是考慮泛型的庫時,或者當我需要向下轉換某些對象以訪問我知道由子類而不是由我在使用的類實現的功能時,我經常使用強制轉換。 不過,在進行該轉換之前,最好先檢查if (foo instanceof Bar)
子句。
當我們反序列化一個對象時(例如從一個字符串中),我們需要將該對象強制轉換為該類,以便我們可以使用其方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.