a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 128|回复: 2

[其他] JAVA技巧:Java自定义的应用技巧分析

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
我们在JAVA中处处都用到了范型,JAVA中的范型是从C++模板继承来的,不过JAVA的范型的功能远远没有C++那么强大。7 t, Y4 a, F1 K0 F7 T. ], V+ q
   
) m8 A6 O3 }7 x& C/ _    我们知道在C++中模板可以很方便的代替任意类型的数据。如下:
5 m: j- [' G) L9 C    2 `, m9 h8 D2 \& D4 h- h
    1. template% H# q1 e- p* y1 \
    # w( X/ j3 r) E
    2.- c+ I2 @( u# Z: E, O# ]& Z, D6 E
    / c" k( A; ~: U# A# ~& a7 z- M: U& m
    3. void show(T x)7 ?+ D9 F- k5 z% `/ p* _
    $ p4 J% l! ~" o, \
    4.
9 G' b1 A  q0 b  H( A+ Y: w    + T' y% j7 d! q: l. o- T5 |" X
    5. {
; i3 F  }3 G) P0 m! F5 J) z) j   
4 g8 Q% c3 F4 l( q1 N6 ^    6.
+ ^! H! z" D$ c; X6 c, b# K/ C" {    4 R8 Y+ K5 N% c8 a& ~) [% t6 M0 R% q
    7. cout《x《endl ;3 S8 ?) y9 s) ?: N
    & g' j1 F) Z0 J6 b/ l& v* J
    8. }
$ s4 j4 e- W1 Z    5 ~* K" h8 X0 u1 g5 L: X! z
    上面的T可以代表任意类型的数据,这样不是大大减少了函数的重载次数,提高了效率呢。Java是从C++过来的,理解了C++,java也不在话下。
8 A& j2 r8 m4 t. `   
' ^- g" M$ L) u8 \5 u- T# z& A    在Java中自定义范型也可以用在方法上。如下:
; ^: Z" ~* c; o% Y/ K    ( `  S& ~0 |4 F1 C$ j7 i
    1、  X3 Z3 ~% [9 t" j& |+ `4 A
   
1 t0 G# N: p* @5 I# C    //这样声明的范型可以代替任意类型数据,我们市场用到的键值对Map.Entry 不就是给予范型的吗?
: C9 B! M6 a/ l- `- {    5 q  z; @  R% P8 [! p, t1 D1 w& a
    K V都可以代替任意类型的值,但是在java中范型的实际类型必须是引用类型。
0 w2 J1 P* ^8 q) M; P; f2 N   
3 w+ J( v+ ?; U* M+ u    1.   void get(K k,V v)
$ F4 t  E2 k9 _4 k+ J: L" O% Q   
7 A4 d  k# `/ b8 _! ]! a    2.9 v9 z; X0 m. C: |4 g6 s
   
0 D4 r0 V% |3 g- V# s! L    3.  {
: [: {8 p+ j. D    6 P" U* ~9 E. ~. A* J, ?) X/ i& s
    4.
1 v+ D( T9 \/ G! a    7 |9 d/ E, K& Z, S. N
    5.
0 d0 x& [+ Y  q0 t   
7 k( L/ o7 N# s/ K, Y% G2 c( c/ r    6.  }
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:28:24 | 显示全部楼层

JAVA技巧:Java自定义的应用技巧分析

2、Java中的范型不能像C++那么灵活。
. b" x. p! e% P& {; w   
8 n5 F" b3 e! U! e) S, ^    1.   T  add(T a,T b)
0 F, C$ [9 A3 N2 R  N' y  l; Z, j    3 k! C( V' p: F& e. T! Y4 h2 D
    2.
3 n+ O) U' g; z; }1 N: h/ i* \    ; o; x' }' N/ b# c% b7 m
    3. {
4 g% O. w6 _, {$ g  J! _   
* S0 S1 x3 w5 T    4.9 g4 V/ ]7 P6 [) x' h; F1 \  ^
   
0 a: F% Y" r# h, c    5.  //return  a+b   ;//很多人以为java也想C++一样可以这样 ,但是不可以 .
) c: ]5 c, ?$ o- J* n+ n    4 I- U6 J, z2 s. U7 _
    6.
  i% C* ]) v2 \% Q    8 N/ b2 K+ [! g8 l) ~& p
    7.  return  null;
8 ?' [# D4 t% \# P& Z1 P0 y   
$ L- \. Y2 Z* {: t  e+ S9 v, l+ u    8.  }- l$ ^) U) [3 H
    4 n+ ^' Z6 ~' c2 v4 H' N$ o
    这个返回的null 也是有类型限制的,比如上面的a b分别是Integer和String 那么就会取他们共同的基类Object做为返回值类型,其他的同理。
( u" D, f6 |2 D" S" G   
8 Z9 J+ {& {0 H# y- k7 S7 ~9 N8 }    3、实现任意类型的数组的成员值的交换,注意在自定义范型中范型的实际类型只能是引用数据类型,不能是基本数据类型。4 N8 t% [$ \! q. U# ]& S
   
4 d% ?. T/ l6 z1 h    1.  public  static void  swap(T[]a,int x,int y)" a# A) ?3 W! R- m1 Z) G$ J/ g" A/ {
   
1 O# T- b* K6 u    2.  {
, G* n' J9 T! R( h7 {  A2 G) @2 H    % o* V4 B/ B/ H" k
    3.  T  tem  =a[x]  ;
, B! ~) ]. u$ i8 r2 O    - y5 t6 i6 k1 @2 u
    4.  a[x]=a[y]  ;
) F( a" W' c& [* V    ) H9 t7 S3 s6 {( C' Q
    5.  a[y]=tem ;
% Z4 ^# \0 ~" r" X; W5 r. ^* w   
4 K! J$ N2 \3 H& \, f% I# @1 j! Y    6.
# `9 j  _$ U5 W# o# X' X; s( O   
/ g( `$ G. w5 _    7.   }* f+ ]9 q" W1 u$ y0 x& W+ a
    " T) Q8 N  l" P* d: _
    上面这个方法如果我swap(new Integer[]{1,2,3,4,5},1,2); //这样就会自动交换下标1 2的值4 g8 L; x6 w- Q# a7 j
    5 i: Y+ \8 K$ l& b
    但是这样调用就错了swao(new int[]{1,2,3,5,6},2,3) ; //所以说Java的范型的实际类型只能是引用数据类型- o( u! u( T3 _/ L, b, x, U; L
    ! z3 g+ y& h: O
    4、$ p' G( j  l7 w$ y3 E
    9 Q% G3 s: d( v8 c8 N; L0 _$ T
    表示类型只能是String或者String的派生类
: i9 U0 H2 D% i8 h7 w3 Z; V1 x    ( h2 Y) V: G4 v
    表示范型类型只能是String或者String的父类% h6 Q7 x5 b' O% g
   
; {4 l% Q& A6 x+ S* U9 s0 f: T& Y    用法同上
( t1 E1 e' W" |0 b" d   
% E. e4 {) O  o' }& f    5、下面这个函数利用范型来实现类型自动转换的功能。
( [* F9 F- s/ p/ N/ f      Q# A' G% Z; E/ ?0 K
    1. public static  T autoConvert(Object obj)0 A  P  W/ H1 g( U, i
    . T0 j$ F, d3 |5 q
    2. //因为返回值是 T标识任意类型 所哟可以 将返回结果赋值给任意类型对象
3 F* M: p. x2 G7 P; W* N   
1 n% ?5 a8 c/ W" l    3.  {: H' @$ O/ |4 ^! |
    4 T) Y6 [6 J' S  L
    4.  return (T)obj;0 H: g- S, ]9 p5 }: u4 B
   
4 T, O7 V& p) }% }9 D& H$ z( m0 c$ u    5.  }
9 \9 t" g; u$ g" B3 g5 W   
# k- D7 V. W( A( ]0 |    6.  Object  obj=="";$ ~) W- k0 r1 I
   
* \; s  F7 _2 o# q  t1 {    7.
# D3 {2 }* O0 B, V5 ~   
! t- p$ x5 W0 f2 G' j: \    8.  String str=autoConvert(obj);3 l2 Q" N! I0 G: Q+ f7 e
   
) e* D/ y1 h3 D6 U* ]' f    可以完成自动转换,因为范型T代表任意类型,因此他可以赋值给String类型的对象。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:28:25 | 显示全部楼层

JAVA技巧:Java自定义的应用技巧分析

6、将任意类型的对象填充到任意类型的数组中,与是fillArray(new Integer[]{2,3,4},"ddd"); 这样调用是正确的,这样做忽略类型限制。* ~5 ?3 ]$ h+ v! t$ d
    $ E7 E! L8 W. L) P4 M0 E' ~! ]
    1. public  static void  fillArray(T[] a,T b)  //将任意一个对象填充到任意类型的数组
' [0 m0 F3 X/ Z  b* w* c    / A- r1 |9 X' R$ J% @( h& D3 K
    2.{
1 H* O# p/ O' W% D" ^2 @   
* B! ?- j1 [5 s3 Q! R/ h. D& n    3. for(int i =0;i
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-22 02:21 , Processed in 0.229440 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表