泛型參數轉換的問題

泛型不同參數類型生成的對象是相互獨立的。

//
Tuple<string> ts;
Tuple<object> to;
//ts to 是兩個類型的對象。

很多時候,我們希望實現 to = ts 這種操作,為什么?因為看上去它應該如此。

為了達到這個目的,就要解決“泛型參數轉換的問題”,這個問題的知識點是in out 泛型變體。老實說,這個問題本身不困難,只是非常不直觀,很容易讓人忘記。

首先一點,為了實現to = ts,實際上是有前提的,那就是該參數只能用在“返回類型”上。

//
delegate object FuncObj();FuncObj func = ()=>"string";

func之所以成功,就是因為string 可以轉換成 object。當“用戶”調用func,希望得到的是object對象,而string也是object對象,所以沒有任何問題。

這里的關鍵是學會采用"用戶"的視角分析問題。

//A
delegate void FuncObj2(object obj);
FuncObj2 func2 = (string str)=>{};
//B
delegate void FuncStr(string str);
FuncStr func3 = (object obj)=>{};


分析這兩組代碼,哪一個更加合理?

在用戶角度,它使用的是func2 和 func3

用戶使用func2,傳遞的對象必然是object,但實際處理的函數是(string)=>{},object是無法轉換成string的,所以很不合理。

用戶使用func3,傳遞的對象只能是string,而實際處理的函數是(object)=>{},string 是可以轉換成object的,所以是合理的。

當然這兩組代碼都是不成立的,因為函數參數類型不匹配。

但是泛型提供了一個方法,讓類型不匹配的對象之間能夠隱式轉換!它實現的邏輯就是上面分析的。

//out 修飾返回類型
delegate ResultType FuncOut<out ResultType>();
//in 修飾參數類型
delegate void FuncIn<in ParamType>(ParamType param);//這是一開始我們想做到的目標
FuncOut<object> fun4 = () => "string";
//這個效果恰好相反
FuncIn<object> funcobj = (object obj) => { };
FuncIn<string> fun5 = funcobj;//注意,泛型變體一般只能和泛型變體之間隱式轉換
//lambda表達式會自動轉換成參數相同的泛型變體,但無法接著做變體之間的隱式轉換,所以需要funcobj來過渡

out修飾返回類型,in修飾參數類型,還是挺形象的,但是要注意泛型in參數,和out參數正好相反。

開始我們想實現 to = ts,只是看到問題的一半,實際上泛型是存在 ts = to的可能性的,希望讀者能理解這一點。

總結:

out : to = ts;

in : ts = to;

沒有修飾:to,ts完全獨立。

---------------------------(備注)-------------------------------
out 參數:只能用在返回類型。

in 參數:只能用在參數。

沒有修飾:任意位置。

---------------------------(備注2)------------------------------

in、out泛型參數只能用在委托和接口上面。

//綜合運用
delegate ResultType FuncInOut<in ParamType, out ResultType>(ParamType param);FuncInOut<object, string> funcobj2 = (object obj) => "string";FuncInOut<string, object> func6 = funcobj2;

轉載于:https://www.cnblogs.com/Nobel/p/6361312.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255508.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255508.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255508.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【python數字信號處理】——循環卷積(也叫圓圈卷積)

目錄 一、公式 二、代碼 方法一:遍歷 方法二:利用卷積定理 一、公式

UI-UIScrollView

- (void)viewDidLoad { [super viewDidLoad]; scrollView [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)]; scrollView.backgroundColor [UIColor redColor]; // 是否支持滑動最頂端 // scrollView.scrollsToTop NO; scrollView.delegate self; // 設…

[COCI2015]ZGODAN

題目大意&#xff1a;   給你一個數$n(n\leq10^1000)$&#xff0c;定義一個數是“美麗數”當且僅當這個數各個數位上的數奇偶性不同。   求最接近$n$的“美麗數”&#xff0c;若有多個&#xff0c;則依次輸出。 思路&#xff1a;   貪心高精度。   首先找出$n$的第一個…

OpenCV學習筆記(三)——Mat,圖像的新容器

自從版本2.0&#xff0c;OpenCV采用了新的數據結構&#xff0c;用Mat類結構取代了之前用extended C寫的cvMat和lplImage&#xff0c;更加好用啦&#xff0c;最大的好處就是更加方便的進行內存管理&#xff0c;對寫更大的程序是很好的消息。 需要注意的幾點&#xff1a;1. Mat的…

jq實現事件委托

事件委托首 頁產品展示公司簡介關于我們聯系我們轉載于:https://www.cnblogs.com/haley168/p/eventTarget.html

【python數字信號處理】——scipy庫設計濾波器(IIR為例)、繪制濾波器頻譜響應、IIR濾波器濾波、讀寫wav音頻文件

目錄 一、參考文獻 1、scipy接口 2、scipy庫介紹+IIR濾波器設計(含GUI)+繪制頻譜響應

關于SQL查詢效率,100w數據,查詢只要1秒

原文:關于SQL查詢效率&#xff0c;100w數據&#xff0c;查詢只要1秒1.關于SQL查詢效率&#xff0c;100w數據&#xff0c;查詢只要1秒&#xff0c;與您分享:機器情況p4: 2.4內存: 1 Gos: windows 2003數據庫: ms sql server 2000目的: 查詢性能測試,比較兩種查詢的性能SQL查詢效…

OpenCV學習筆記(五十四)——概述FaceRecognizer人臉識別類contrib

在最新版的2.4.2中&#xff0c;文檔的更新也是一大亮點&#xff0c;refrence manual擴充了200多頁的內容&#xff0c;添加了contrib部分的文檔。contrib就是指OpenCV中新添加的模塊&#xff0c;但又不是很穩定&#xff0c;可以認為是一個雛形的部分。這次結合refman的閱讀&…

【調試】Linux下超強內存檢測工具Valgrind

【調試】Linux下超強內存檢測工具Valgrind 內容簡介 Valgrind是什么&#xff1f;Valgrind的使用Valgrind詳細教程1. Valgrind是什么&#xff1f; Valgrind是一套Linux下&#xff0c;開放源代碼&#xff08;GPLV2&#xff09;的仿真調試工具的集合。Valgrind由內核&#xff08;c…

【python學習】——讀取csv文件

file_name rD:\ParttimeJobs\MinistConfiguration\datas\mnist_train.csv # 數據集為42000張帶標簽的28x28手寫數字圖像y []x []y_t []x_t []with open(file_name, r) as f:reader csv.reader(f)header_row next(reader)# print(header_row)for row in reader:if np.ra…

機器學習實戰(python)-Ch02KNN-Notes

Chapter2 KNN 1.numpy.tile函數 格式&#xff1a;tile&#xff08;A,reps&#xff09; * A&#xff1a;array_like * 輸入的array * reps&#xff1a;array_like * A沿各個維度重復的次數 舉例&#xff1a;A[1,2] 1. tile(A,2) 結果&#xff1a;[1,2,1,2] 2. tile(A,(2,3)) 結果…

猜1-10的數字python腳本

#!/usr/bin/python#coding:utf-8import randomnumrandom.randint(1,10)while True:caiint(raw_input(請輸入隨機數字:))if cai num:print 猜對了exit()elif cai > num:print 猜大了else:print 猜小了非交互式的cp腳本#!/usr/bin/python#coding:utf-8import sysfile1sys.arg…

慣量匹配和最佳傳動比

慣量是剛體繞軸轉動慣性的度量&#xff0c;轉動慣量是表征剛體轉動慣性大小的物理量。它是伺服選型的重要標準&#xff0c;如果慣量匹配不好&#xff0c;會導致電機運行不穩定。如小慣量電機制動性能好&#xff0c;運行反應速度快&#xff0c;適用于輕負載、高速定位的環境;而中…

【pyqt5學習】——滑動條的使用slider

1、獲取滑動條當前值: 滑動條名稱.value() self.threshold1 self.horizontalSlider.value() self.threahold2 self.horizontalSlider_2.value() 2、滑動條值改變信號綁定槽函數 滑動條名稱.valueChanged.connect(槽函數&#xff09; # 滑條值變化 self.horizontalSlider.valu…

hibernate多對一單向外鍵

hibernate多對一單向外鍵&#xff1a; 描述&#xff1a; 轉載于:https://www.cnblogs.com/blogofwyl/p/5402197.html

Spring在bean配置文件中定義電子郵件模板

在上一篇Spring電子郵件教程&#xff0c;硬編碼的所有電子郵件屬性和消息的方法體中的內容&#xff0c;這是不實際的&#xff0c;應予以避免。應該考慮在Spring bean 配置文件中定義電子郵件模板。1.Spring的郵件發件人Java類使用 Spring的MailSender接口發送電子郵件&#xff…

斐波那契數列規律的計算。

斐波那契數列就是某一個數&#xff0c;總是前兩個數之和&#xff0c;比如0&#xff0c;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8。由于輸出是一串數字&#xff0c;可以用列表的結構存儲。開始時&#xff0c;列表中有兩個值&#xff0c;即0&#xf…

【PyQt5學習】——顏色面板使用(QcolorDialog)

from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * BB = QDialogButtonBox# 顏色窗口 class ColorDialog(QColorDialog):def __init__(self, parent=None):super(ColorDialog, self).__init__(parent)self.setOption(QColorDialog.ShowAlph…

PropertyPlaceholderConfigurer實現配置文件讀取

PropertyPlaceholderConfigurer實現配置文件讀取 PropertyPlaceholderConfigurer類的主要的用法是將BeanFactory里定義的內容放在一個.properties的文件中. PropertyPlaceholderConfigurer是個bean工廠后置處理器的實現&#xff0c;也就是BeanFactoryPostProcessor接口的一個實…

算法練習5---快速排序Java版

基本思想&#xff1a;通過一趟排序將要排序的數據分割成獨立的兩部分&#xff0c;其中一部分的所有數據都比另外一部分的所有數據都要小&#xff0c;然后再按此方法對這兩部分數據分別進行快速排序&#xff0c;整個排序過程可以遞歸進行&#xff0c;以此達到整個數據變成有序序…