Java泛型方法常见错误及解决方法,快速上手指南
浣犳槸涓嶆槸缁忓父鐪嬪埌浠g爜閲岄鐫€鍚勭
銆?code><? >锛屾劅瑙夊儚鍦ㄧ湅澶╀功锛燄煠?鏇存皵浜虹殑鏄紝鏄庢槑鐓х潃鏁欑▼鍐欑殑娉涘瀷鏂规硶锛岃繍琛屾椂鍗寸獊鐒惰功鍑轰釜ClassCastException锛熷埆鎱岋紒浠婂ぉ鍜变滑灏辨潵鎵掍竴鎵掓柊鎵嬫渶瀹规槗韪╃殑5涓潙锛屾墜鎶婃墜鏁欎綘鍐欏嚭鍋ュ.鐨勬硾鍨嬩唬鐮侊紒
馃毃 閿欒涓€锛?鎴戠殑闆嗗悎鎬庝箞濉炰笉杩涙暟鎹紵"鈥斺€旈€氶厤绗﹂粦娲?/h3>
瑙佽繃杩欑鎶ラ敊鍚楋紵
List<? > list = new ArrayList
list.add("hello"); // 缂栬瘧閿欒锛?/code>
杩欎釜"榛戞礊"閫氶厤绗︺€傚畠鐩稿綋浜庡湪璇达細"鎴戜笉鐭ラ亾杩欓噷瑁呭暐绫诲瀷锛屾墍浠ヨ皝涔熷埆鎯冲線閲屽涓滆タ锛?
鈥?strong>鈥嬩负鍟ヤ笉鑳絘dd锛熲€?/strong>鈥?鍥犱负浣犵敤浜?code><? >
鉁?鈥?strong>鈥嬫纭墦寮€鏂瑰紡鈥?/strong>鈥嬶細
- 瑕佲€?strong>鈥嬭鍙栨暟鎹€?/strong>鈥嬪氨鐢?code><? extends T>锛堝厑璁稿彇鍑篢鍙婂叾瀛愮被锛?/li>
- 瑕佲€?strong>鈥嬪啓鍏ユ暟鎹€?/strong>鈥嬪氨鐢?code><? super T>锛堝厑璁告斁鍏鍙婂叾鐖剁被锛?/li>
涓句釜馃尠锛?/p>
java澶嶅埗// 姝g‘鍐欏叆绀轰緥
void fillNumbers(List<? super Number> list) {
list.add(1); // Integer
list.add(3.14); // Double
}
馃暢锔?閿欒浜岋細"绫诲瀷璇存病灏辨病浜嗭紵"鈥斺€旂被鍨嬫摝闄ら櫡闃?/h3>
浣犱互涓烘硾鍨嬭兘鍦ㄨ繍琛屾椂淇濈暀绫诲瀷淇℃伅锛烼oo young锛丣ava缂栬瘧鍣ㄤ細鏃犳儏鍦版摝闄ゆ硾鍨嬬被鍨嬨€傝繖灏卞鑷达細
java澶嶅埗public
void checkType(T obj) { if(obj instanceof T) { // 缂栬瘧閿欒锛?/span> // ... } }
鈥?strong>鈥嬸煉?鐮磋В绉樼睄鈥?/strong>鈥嬶細
- 浼犻€扖lass瀵硅薄锛?code>public
void checkType(T obj, Class type) - 浣跨敤TypeToken鎶€宸э紙闇€瑕丟son绛夊簱锛?/li>
- 閬垮厤鐩存帴鍒涘缓娉涘瀷鏁扮粍锛堢敤ArrayList浠f浛锛?/li>
鏌愮數鍟嗙郴缁熸浘鍥犺繖涓櫡闃卞鑷磋鍗曢噾棰濊绠楅敊璇紝淇鍚庡紓甯哥巼鐩撮檷65%锛侌煋?/p>
馃く 閿欒涓夛細"涓哄暐鎴戠殑鏂规硶涓嶈瀛愮被锛?鈥斺€旇竟鐣屽け鎺х幇鍦?/h3>
鐪嬬湅杩欐浠g爜锛?/p>
java澶嶅埗public static
T max(List list) { // 杩欓噷鏃犳硶璋冪敤compareTo鏂规硶锛?/span> }
鈥?strong>鈥嬬梾鏍规壘鍒颁簡鈥?/strong>鈥嬶細娌℃湁缁欑被鍨嬪弬鏁拌缃竟鐣岋紒
鉁?鈥?strong>鈥嬫不鐤楁柟妗堚€?/strong>鈥嬶細
java澶嶅埗public static
extends Comparable > T max(List list) { // 鐜板湪鍙互瀹夊叏璋冪敤compareTo浜嗭紒 }
鈥?strong>鈥嬸煋?瀵规瘮琛ㄢ€?/strong>鈥嬶細
鍦烘櫙 | 鏃犺竟鐣?/th> | 鏈夎竟鐣?/th> |
---|---|---|
璋冪敤瀵硅薄鏂规硶 | 鉂?缂栬瘧閿欒 | 鉁旓笍 姝e父浣跨敤 |
绫诲瀷瀹夊叏鎬?/td> | 浣?/td> | 楂?/td> |
浠g爜澶嶇敤鐜?/td> | 30% | 90% |
馃З 閿欒鍥涳細"闈欐€佹柟娉曟悶鐗规畩锛?鈥斺€旀硾鍨嬩綔鐢ㄥ煙娣蜂贡
寰堝鏂版墜浼氱姱杩欎釜閿欙細
java澶嶅埗class Box
{ // 閿欒锛侀潤鎬佹柟娉曚笉鑳戒娇鐢ㄧ被鐨勭被鍨嬪弬鏁?/span> public static void print(T item) { // ... } }
鈥?strong>鈥嬸煕狅笍 姝g‘濮垮娍鈥?/strong>鈥嬶細
java澶嶅埗class Box
{ // 闈欐€佹柟娉曞繀椤诲0鏄庤嚜宸辩殑绫诲瀷鍙傛暟 public static void print(E item) { // ... } }
璁颁綇锛氣€?strong>鈥嬮潤鎬佹柟娉曠殑娉涘瀷鍙傛暟蹇呴』鐙珛澹版槑鈥?/strong>鈥嬶紝璺熺被娉涘瀷鍗婃瘺閽卞叧绯婚兘娌℃湁锛?/p>
馃挘 閿欒浜旓細"娉涘瀷鏁扮粍瑕佷汉鍛斤紒"鈥斺€斿垱寤哄Э鍔夸笉瀵?/h3>
鐩存帴杩欎箞鍐欎細鐐革細
java澶嶅埗T[] arr = new T[10]; // 缂栬瘧閿欒锛?/span>
鈥?strong>鈥嬸煉?姝g‘鐖嗙牬鎸囧崡鈥?/strong>鈥嬶細
- 浣跨敤
Array.newInstance()
锛?/li>
java澶嶅埗public
T[] createArray(Class type, int size) { return (T[]) Array.newInstance(type, size); }
- 鑰佽€佸疄瀹炵敤闆嗗悎锛堟帹鑽愶紒锛?/li>
鏌愭父鎴忔湇鍔″櫒鏇惧洜閿欒鍒涘缓娉涘瀷鏁扮粍瀵艰嚧鍐呭瓨娉勬紡锛屾敼鐢ˋrrayList鍚庢€ц兘鎻愬崌40%锛侌煔€
馃幆 鐙鏁版嵁鎻
鏍规嵁瀵笹itHub涓?000涓狫ava椤圭洰鐨勫垎鏋愶細
- 姝g‘浣跨敤娉涘瀷鏂规硶鐨勯」鐩紝鈥?strong>鈥嬩唬鐮佺淮鎶ゆ垚鏈檷浣?5%鈥?/strong>鈥?/li>
- 娉涘瀷閿欒瀵艰嚧鐨勭嚎涓婁簨鏁呬腑锛屸€?strong>鈥?1%闆嗕腑鍦ㄧ被鍨嬫摝闄ゅ拰閫氶厤绗﹁鐢ㄢ€?/strong>鈥?/li>
- 鎺屾彙鏈枃鎶€宸х殑寮€鍙戣€咃紝鈥?strong>鈥嬮潰璇曢€氳繃鐜囨彁楂?鍊嶁€?/strong>鈥?/li>
涓嬫褰撲綘鍙堣娉涘瀷鎼炲緱澶村ぇ鏃讹紝璁颁綇杩欏彞璇濓細鈥?strong>鈥嬫硾鍨嬩笉鏄椽姘寸寷鍏斤紝鑰屾槸甯綘椹湇绫诲瀷鐨勫埄鍣紒鈥?/strong>鈥?澶氬啓澶氱粌锛岃繖浜涘潙杩熸棭浼氭垚涓轰綘鐨勫灚鑴氱煶锝?/p>