娉涘瀷鏄粈涔?/h5>
綆鍗曠殑鏉ヨ錛屾硾鍨嬪彲浠ヨ涓烘槸綾誨瀷鍙傛暟鍖栫殑鎶鏈傜浉瀵逛簬綾誨瀷鐨勫弬鏁板寲錛屽湪浼犵粺鐨刯ava浠g爜涓紝鎴戜滑鍙互鐞嗚В涓烘墍鏈夌殑鍙傛暟閮芥槸鍊肩殑鍙傛暟鍖栵紝渚嬪浠ヤ笅浠g爜錛?br />
1 package org.dbstar.generic;
2
3 public class ValueHolder {
4 private String value;
5
6 public ValueHolder(String value) {
7 this.value = value;
8 }
9
10 public String getValue() {
11 return value;
12 }
13
14 public void setValue(String value) {
15 this.value = value;
16 }
17 }
鍏朵腑鐨勬垚鍛樺彉閲忋佹瀯閫犲嚱鏁板弬鏁板拰鏂規硶鍙傛暟錛岄兘鍙互璁や負鏄肩殑鍙傛暟鍖栫殑浣撶幇銆備絾鏄紝涓嶇鍊煎浣曞彉鍖栵紝鍊肩殑綾誨瀷鍙兘灞闄愪簬String鍙婂叾瀛愮被錛屽鏋滄垜浠兂璁¬alueHolder鍚屾椂涔熻兘鎸佹湁涓涓狪nteger綾誨瀷鐨勫鹼紝閭d箞鍦ㄤ紶緇熺殑Java浠g爜涓紝鍙兘灝嗘垚鍛樺彉閲忕殑綾誨瀷瀹氫箟涓篛bject錛屽涓嬶細
1 package org.dbstar.generic;
2
3 public class ValueHolder {
4 private Object value;
5
6 public ValueHolder(Object value) {
7 this.value = value;
8 }
9
10 public Object getValue() {
11 return value;
12 }
13
14 public void setValue(Object value) {
15 this.value = value;
16 }
17 }
浣跨敤Object鐗堢殑ValueHolder鐨勪唬鐮佺湅璧鋒潵浼氬儚榪欐牱錛?br />
1 public static void main(String[] args) {
2 ValueHolder vhi = new ValueHolder(new Integer(1));
3 ValueHolder vhs = new ValueHolder("abc");
4 ValueHolder vho = new ValueHolder(new Object());
5 System.out.println("ValueHolder of Integer=" + vhi.getValue());
6 System.out.println("ValueHolder of String=" + vhs.getValue());
7 System.out.println("ValueHolder of Object=" + vho.getValue());
8 }
杈撳嚭緇撴灉涓猴細
1 ValueHolder of Integer=1
2 ValueHolder of String=abc
3 ValueHolder of Object=java.lang.Object@757aef
騫歌繍鐨勬槸錛孞ava5緇欐垜浠彁渚涗簡涓涓皢value鐨勭被鍨嬩篃浣滀負涓涓弬鏁版潵璁劇疆鐨勬柟娉曪紝閭e氨鏄硾鍨嬶紝涓嬮潰鏄皢value鐨勭被鍨嬩篃鍙傛暟鍖栧悗鐨刅alueHolder瀹炵幇錛?br />
1 package org.dbstar.generic;
2
3 public class ValueHolder<E> {
4 private E value;
5
6 public ValueHolder(E value) {
7 this.value = value;
8 }
9
10 public E getValue() {
11 return value;
12 }
13
14 public void setValue(E value) {
15 this.value = value;
16 }
17 }
鍏朵腑錛寁alue灝辨槸鍊肩殑鍙傛暟鍖栵紝value鐨勭被鍨嬬幇鍦ㄥ畾涔変負E錛?lt;E>灝辨槸綾誨瀷鐨勫弬鏁板寲銆備嬌鐢╒alueHolder鐨勪唬鐮佷篃鐩稿簲鍙戠敓浜嗗彉鍖栵細
1 ValueHolder<Integer> vhi = new ValueHolder<Integer>(new Integer(1));
2 ValueHolder<String> vhs = new ValueHolder<String>("abc");
3 ValueHolder<Object> vho = new ValueHolder<Object>(new Object());
4 System.out.println("ValueHolder of Integer=" + vhi.getValue().intValue());
5 System.out.println("ValueHolder of String=" + vhs.getValue().substring(1));
6 System.out.println("ValueHolder of Object=" + vho.getValue());
鏍規嵁ValueHolder綾誨瀷瀹氫箟鐨勪笉鍚岋紝綾誨瀷鍙傛暟<E>鍦ㄤ笉鍚屽満鍚堜唬琛ㄤ簡涓嶅悓鐨勫疄闄呯被鍨嬨?br />
娉涘瀷鐨勮祴鍊?/h5>
涓庡煎弬鏁扮殑璧嬪間笉鍚岀殑鏄紝綾誨瀷鍙傛暟鐨勮祴鍊兼湁鍏剁壒孌婃э紝涓嬮潰鏉ラ愪竴璇存槑錛?br />
A銆傚悓綾誨瀷璧嬪鹼細
1 ValueHolder<Integer> vhi = new ValueHolder<Integer>(new Integer(1));
2 ValueHolder<Integer> vhi2 = vhi;
3 vhi2.setValue(new Integer(2));
4 System.out.println("ValueHolder of Integer2=" + vhi2.getValue().intValue());
榪欑璧嬪煎悗鐨勫彉閲忥紝涓庢簮鍙橀噺鍏鋒湁瀹屽叏涓鑷寸殑鎿嶄綔錛屽寘鎷幏鍙栨硾鍨嬪彉閲忓拰鍦ㄦ柟娉曞弬鏁頒腑璁劇疆娉涘瀷鍙橀噺銆?br />
B銆傝秴綾誨瀷璧嬪鹼細
1 ValueHolder<Integer> vhi = new ValueHolder<Integer>(new Integer(1));
2 ValueHolder<Number> vhi3 = vhi;//瀹為檯涓婏紝榪欐槸涓嶅厑璁哥殑錛屼細瀵艱嚧緙栬瘧閿欒
3 ValueHolder<? extends Number> vhi2 = vhi;//蹇呴』瑕佽繖鏍峰啓
4 System.out.println("ValueHolder of Integer2=" + vhi2.getValue().intValue());
5 vhi2.setValue(new Integer(2));//瓚呯被鍨嬭祴鍊煎悗錛屾搷浣滃彈鍒伴檺鍒訛紝浼氬鑷寸紪璇戦敊璇?/span>
6 vhi2.setValue(null);//鍙湁璁劇疆null鍊兼墠鏄悎娉曠殑錛屽叾浠栧間竴姒備笉鍏佽璁劇疆
榪欑璧嬪煎悗鐨勫彉閲忥紝鑳借皟鐢ㄨ繑鍥炲間負娉涘瀷鍙橀噺鐨勬柟娉曪紝浣嗘槸鍙兘浣跨敤鏂版硾鍨嬪彉閲忕被鍨嬬殑鏂規硶錛岃屼笉鑳藉啀浣跨敤鍘熸湁娉涘瀷鍙橀噺綾誨瀷涓婄殑鏂規硶錛岃繖鏍瘋鏈夌偣緇曪紝涓句緥鏉ヨ錛屼笂闈㈢殑vhi2灝卞彧鑳戒嬌鐢∟umber綾誨瀷涓婂畾涔夌殑鏂規硶錛岃屾棤娉曞啀浣跨敤鍘熷厛鍦↖nteger綾誨瀷涓婂畾涔夌殑鏂規硶浜嗐?br />
ValueHolder<?>絳夋晥浜嶸alueHolder<? extends Object>錛屽洜涓篛bject鏄墍鏈夌被鐨勮秴綾匯?br />
C銆傚瓙綾誨瀷璧嬪鹼細
1 @SuppressWarnings("unchecked")
2 ValueHolder<Integer> vhi3 = (ValueHolder<Integer>) vhi2;
鍜屽煎弬鏁扮殑璧嬪間竴鏍鳳紝瓚呯被鍨嬬殑娉涘瀷鍙橀噺寰瀛愮被鍨嬬殑娉涘瀷鍙橀噺璧嬪鹼紝闇瑕佸己鍒惰漿鎹紝杞崲鍚庣殑vhi3涓巚hi鍏鋒湁瀹屽叏涓鑷寸殑鎿嶄綔銆備絾鏄紝闇瑕佹敞鎰忕殑涓鐐規槸錛岃繖縐嶈漿鎹細瀵艱嚧涓涓猽nchecked鐨勭紪璇戞椂璀﹀憡錛岃屼笖錛岃嫢鏃犳硶瀹屾垚杞崲錛屼細瀵艱嚧涓涓繍琛屾椂鐨凜lassCastException寮傚父錛屼緥濡傦細
1 @SuppressWarnings("unchecked")
2 ValueHolder<Double> vhi3 = (ValueHolder<Double>) vhi2;//榪欓噷涓嶄細鎶涘嚭寮傚父
3 vhi3.setValue(new Double(12.5));
4 System.out.println("ValueHolder of Double=" + vhi3.getValue().doubleValue());
5 System.out.println("ValueHolder of Integer=" + vhi.getValue().intValue());//浼氬湪榪欓噷鎶涘嚭ClassCastException
涓婁緥涓紝vhi2灝咺nteger綾誨瀷杞崲鎴愪簡瓚呯被鍨婲umber錛岃寁hi3鍙堝皢Number寮虹被鍨嬭漿鎹㈡垚浜咲ouble錛岃繖涔熸槸鍏佽鐨勶紝涓嶄細寮曞彂緙栬瘧鏃墮敊璇垨鑰呰繍琛屾椂閿欒銆備笅闈㈢敋鑷寵繕鍙互緇檝hi3璁劇疆涓涓狣ouble鐨勫鹼紝鍊煎緱娉ㄦ剰鐨勬槸錛寁hi3鍏跺疄灝辨槸vhi錛屾垜浠粰涓涓狪nteger鐨勫彉閲忚緗簡涓涓狣ouble鐨勫鹼紝鍗存病鏈夊紩鍙戜換浣曞紓甯革紝榪樼湡鏄寮傜殑寰堛傞殢鍚庯紝鎴戜滑鍦ㄨ皟鐢╲hi.getValue().intValue()鏃訛紝鎵嶇粓浜庡紩鍙戜簡ClassCastException銆傜敱姝ゅ彲瑙侊紝榪欑寮虹被鍨嬭漿鎹㈡湁鏃跺欎細浣塊敊璇彉寰楅潪甯擱殣鏅﹂毦浜庡彂鐜幫紝鎴戜滑搴旇灝介噺閬垮厤榪欑杞崲鐨勪嬌鐢ㄣ?br />
D銆備紶緇熶唬鐮佽祴鍊鹼細
1 @SuppressWarnings("unchecked")
2 ValueHolder vh = vhi;
3 vh.setValue(new Integer(3));
涓嶆寚瀹氱被鍨嬪弬鏁扮殑娉涘瀷綾伙紝縐頒箣涓簉ow type錛岃繖鏄疛ava5娉涘瀷涓轟簡涓庤佺増鏈殑浠g爜鍏煎鑰岄夋嫨鐨勪竴縐嶅鐞嗘柟寮忋俁ow type鐨勬硾鍨嬬被涓紝鎵鏈夌殑綾誨瀷鍙傛暟閮借褰撳仛Object鏉ュ鐞嗭紝涔熷氨鏄錛孷alueHolder鍙互褰撳仛ValueHolder<Object>鏉ュ鐞嗭紝浣嗘槸涓嶸alueHolder<Object>鍙堟湁鎵涓嶅悓錛屽洜涓篤alueHolder<Integer>鏄笉鑳借杞崲涓篤alueHolder<Object>鐨勶紝鑰岃兘杞崲鐨刅alueHolder<? extends Object>鍙堜笉鑳借皟鐢╯etValue鏂規硶(褰撶劧鍙互璁劇疆null鍊鹼紝鑰屽叾浠栭潪null鍊間笉鑳借緗?銆傚煎緱娉ㄦ剰鐨勬槸錛岃漿鎹㈠埌浼犵粺浠g爜錛屼互鍙婁嬌鐢ㄤ紶緇熶唬鐮佽皟鐢ㄦ湁娉涘瀷鍙傛暟鐨勬柟娉曪紝浼氬紩璧蜂竴涓猽nchecked鐨勭紪璇戞椂璀﹀憡銆?br />

]]>