O O P w i t h J a v a Y u a n b i n Wu c s @e c - - PowerPoint PPT Presentation
O O P w i t h J a v a Y u a n b i n Wu c s @e c - - PowerPoint PPT Presentation
O O P w i t h J a v a Y u a n b i n Wu c s @e c n u O O P w i t h J a v a P 2 9 r o j e c t 7 : 6 7 6 1 4 6 2 1 6
O O P w i t h J a v a
- 通知
– P
r
- j
e c t 7 : 6 月 2 7 日晚 9 点
– 6
月 1 4 日复习
– 6
月 2 1 日考试
– 答疑
- 6
月 2 日 1 3 : 0 – 1 5 : 0
- 理科楼 B
9 1 1
a b s t r a c t c l a s s d e m
- {
p u b l i c i n t a ; d e m
- (
) { a = 1 ; } a b s t r a c t p u b l i c v
- i
d s e t ( ) ; a b s t r a c t fi n a l p u b l i c v
- i
d g e t ( ) ; } c l a s s T e s t e x t e n d s d e m
- {
p u b l i c v
- i
d s e t ( i n t a ) { t h i s . a = a ; } fi n a l p u b l i c v
- i
d g e t ( ) { S y s t e m .
- u
t . p r i n t l n ( " a = " + a ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { T e s t
- b
j = n e w T e s t ( ) ;
- b
j . s e t ( 2 ) ;
- b
j . g e t ( ) ; } }
c l a s s T e s t { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { t r y { i n t a = ; S y s t e m .
- u
t . p r i n t l n ( " a = " + a + " \ n " ) ; i n t b = 2 / a ; S y s t e m .
- u
t . p r i n t l n ( " b = " + b ) ; } c a t c h ( A r i t h m e t i c E x c e p t i
- n
e ) { S y s t e m .
- u
t . p r i n t l n ( " D i v i d e b y z e r
- e
r r
- r
" ) ; } fi n a l l y { S y s t e m .
- u
t . p r i n t l n ( " i n s i d e t h e fi n a l l y b l
- c
k " ) ; } } }
p u b l i c c l a s s T e s t { p r i v a t e i n t x = 1 ; p r i v a t e i n t y = 2 ; p r i v a t e s t a t i c i n t z = 3 ; p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { i n t x = 4 ; i n t y = 5 ; i n t z = 6 ; n e w T e s t ( ) . n e w I n n e r ( ) . i n i t ( ) ; } c l a s s I n n e r { v
- i
d i n i t ( ) { S y s t e m .
- u
t . p r i n t l n ( x + " " + y + " " + z ) ; } } }
i n t e r f a c e F
- {
i n t x = 1 ; } p u b l i c c l a s s T e s t { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { F
- .
x = 2 ; S y s t e m .
- u
t . p r i n t l n ( F
- .
x ) ; } }
1 . 定义一个 L i n k e d L i s t , 其中包含 S t r i n g 对象 . 2 . 编写方法遍历该 L i n k e d L i s t .
- 复习
- I
/ O 流
– I
n p u t S t r e a m / R e a d e r
- r
e a d ( )
– O
u t p u t S t r e a m / Wr i t e r
- w
r i t e ( )
– 抽象 :
数据的来源 / 数据的目的地
- B
y t e A r r a y S t r e a m , F i l e S t r e a m S t r i n g S t r e a m O b j e c t S t r e a m
i m p
- r
t j a v a . i
- .
F i l e I n p u t S t r e a m ; i m p
- r
t j a v a . i
- .
F i l e O u t p u t S t r e a m ; i m p
- r
t j a v a . i
- .
I O E x c e p t i
- n
; p u b l i c c l a s s C
- p
y B y t e s { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) t h r
- w
s I O E x c e p t i
- n
{ F i l e I n p u t S t r e a m i n = n u l l ; F i l e O u t p u t S t r e a m
- u
t = n u l l ; t r y { i n = n e w F i l e I n p u t S t r e a m ( " x a n a d u . t x t " ) ;
- u
t = n e w F i l e O u t p u t S t r e a m ( "
- u
t a g a i n . t x t " ) ; i n t c ; w h i l e ( ( c = i n . r e a d ( ) ) ! =
- 1
)
- u
t . w r i t e ( c ) ; } fi n a l l y { i f ( i n ! = n u l l ) i n . c l
- s
e ( ) ; i f (
- u
t ! = n u l l )
- u
t . c l
- s
e ( ) ; } } }
- 装饰器
– F
i l t e r I n p u t S t r e a m / F i l t e r O u t p u t S t r e a m
- B
u ff e r e d I n p u t S t r e a m
- D
a t a I n p u t S t r e a m
F i l e I n p u t S t r e a m fi n = n e w F i l e I n p u t S t r e a m ( " x a n a d u . t x t " ) ; B u ff e r e d I n p u t S t r e a m b f = n e w B u ff e r e d I n p u t S t r e a m ( fi n ) ; D a t a I n p u t S t r e a m d i n = n e w D a t a I n p u t S t r e a m ( b f ) ; d i n . r e a d ( ) ; d i n . r e a d I n t ( ) ; d i n . r e a d D
- u
b l e ( ) ; F i l e O u t p u t S t r e a m f
- u
t = n e w F i l e O u t p u t S t r e a m ( " x a n a d u . t x t " ) ; B u ff e r e d O u t p u t S t r e a m b f = n e w B u ff e r e d O u t p u t S t r e a m ( f
- u
t ) ; D a t a O u t p u t S t r e a m d
- u
t = n e w D a t a O u t p u t S t r e a m ( b f ) ; d
- u
t . w r i t e ( 1 ) ; d
- u
t . w r i t e I n t ( 1 ) ; d
- u
t . w r i t e D
- u
b l e ( 3 . 1 4 ) ;
- 复习
I n p u t S t r e a m F i l t e r I n p u t S t r e a m
B u ff e r d I n p u t S t r e a m D a t a I n p u t S t r e a m S t r i n g B u ff e r I n p u t S t r e a m F i l e I n p u t S t r e a m B y t e A r r a y I n p u t S t r e a m
装饰器
O O P w i t h J a v a
- 运行时类型信息
- 泛型
R T T I
- 运行时类型信息
– R
u n T i m e T y p e I n f
- r
m a t i
- n
( R T T I )
– C
l a s s 类
- 每一个类都包含一个 C
l a s s 类的对象
- 该对象包含该类的信息
– 类名字 – 类的有哪些方法 – 类的有哪些成员
R T T I
- 每个类的静态成员
– 所有对象共享一个 C
l a s s 对象
- 每个对象调用 g
e t C l a s s ( ) 获得 C l a s s 类的对象
– S
t r i n g s = “ h e l l
- ”
; C l a s s c = s . g e t C l a s s ( ) ;
- 每个类通过 .
c l a s s 获得 C l a s s 类的对象
– C
l a s s c = S t r i n g . c l a s s
R T T I
- C
l a s s 类的方法
– g
e t N a m e ( )
– g
e t I n t e r f a c e s ( )
– g
e t S u p e r c l a s s ( )
– n
e w I n s t a n c e ( )
i n t e r f a c e A { } i n t e r f a c e B { } i n t e r f a c e C { } c l a s s T
- y
{ T
- y
( ) { } T
- y
( i n t i ) { } } c l a s s F a n c y T
- y
e x t e n d s T
- y
i m p l e m e n t s A , B , C { F a n c y T
- y
( ) { s u p e r ( 1 ) ; } } p u b l i c c l a s s T
- y
T e s t { s t a t i c v
- i
d p r i n t I n f
- (
C l a s s c ) { S y s t e m .
- u
t . p r i n t l n ( " C l a s s n a m e : " + c . g e t N a m e ( ) ) ; S y s t e m .
- u
t . p r i n t l n ( “ I s i n t e r f a c e ? ” + c . i s I n t e r f a c e ( ) ) ; S y s t e m .
- u
t . p r i n t l n ( " S i m p l e n a m e : " + c . g e t S i m p l e N a m e ( ) ) ; S y s t e m .
- u
t . p r i n t l n ( " C a n
- n
i c a l n a m e : " + c . g e t C a n
- n
i c a l N a m e ( ) ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { C l a s s c = n u l l ; t r y { c = C l a s s . f
- r
N a m e ( " F a n c y T
- y
" ) ; } c a t c h ( C l a s s N
- t
F
- u
n d E x c e p t i
- n
e ) { S y s t e m .
- u
t . p r i n t l n ( " C a n ’ t fi n d F a n c y T
- y
" ) ; S y s t e m . e x i t ( 1 ) ; } p r i n t I n f
- (
c ) ; f
- r
( C l a s s f a c e : c . g e t I n t e r f a c e s ( ) ) p r i n t I n f
- (
f a c e ) ; C l a s s u p = c . g e t S u p e r c l a s s ( ) ; O b j e c t
- b
j = n u l l ; t r y { / / R e q u i r e s d e f a u l t c
- n
s t r u c t
- r
:
- b
j = u p . n e w I n s t a n c e ( ) ; } c a t c h ( I n s t a n t i a t i
- n
E x c e p t i
- n
e ) { S y s t e m .
- u
t . p r i n t l n ( " C a n n
- t
i n s t a n t i a t e " ) ; S y s t e m . e x i t ( 1 ) ; } c a t c h ( I l l e g a l A c c e s s E x c e p t i
- n
e ) { S y s t e m .
- u
t . p r i n t l n ( " C a n n
- t
a c c e s s " ) ; S y s t e m . e x i t ( 1 ) ; } p r i n t I n f
- (
- b
j . g e t C l a s s ( ) ) ; } }
R T T I
- R
T T I 的用途
– 给定 O
b j e c t 引用 , 判断它的类型 ( D
- w
n c a s t i n g )
S t r i n g s = n e w S t r i n g ( “ h e l l
- ”
) ; O b j e c t
- =
s ; S t r i n g t y p e =
- .
g e t C l a s s ( ) . g e t N a m e ( ) ; S t r i n g t = ( S t r i n g )
- ;
泛型
- 容器
– n
e w A r r a y L i s t ( ) ;
c l a s s A p p l e { p r i v a t e s t a t i c l
- n
g c
- u
n t e r ; p r i v a t e fi n a l l
- n
g i d = c
- u
n t e r + + ; p u b l i c l
- n
g i d ( ) { r e t u r n i d ; } } c l a s s O r a n g e { }
p u b l i c c l a s s A p p l e s A n d O r a n g e s Wi t h
- u
t G e n e r i c s { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { A r r a y L i s t a p p l e s = n e w A r r a y L i s t ( ) ; f
- r
( i n t i = ; i < 3 ; i + + ) a p p l e s . a d d ( n e w A p p l e ( ) ) ; / / N
- t
p r e v e n t e d f r
- m
a d d i n g a n O r a n g e t
- a
p p l e s : a p p l e s . a d d ( n e w O r a n g e ( ) ) ; f
- r
( i n t i = ; i < a p p l e s . s i z e ( ) ; i + + ) ( ( A p p l e ) a p p l e s . g e t ( i ) ) . i d ( ) ; / / O r a n g e i s d e t e c t e d
- n
l y a t r u n t i m e } }
泛型
- 类型安全的容器
– n
e w A r r a y L i s t < A p p l e > ( ) ;
p u b l i c c l a s s A p p l e s A n d O r a n g e s Wi t h G e n e r i c s { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { A r r a y L i s t < A p p l e > a p p l e s = n e w A r r a y L i s t < A p p l e > ( ) ; f
- r
( i n t i = ; i < 3 ; i + + ) a p p l e s . a d d ( n e w A p p l e ( ) ) ; / / C
- m
p i l e e r r
- r
! / / a p p l e s . a d d ( n e w O r a n g e ( ) ) ; f
- r
( i n t i = ; i < a p p l e s . s i z e ( ) ; i + + ) a p p l e s . g e t ( i ) . i d ( ) ; } f
- r
( A p p l e c : a p p l e s ) S y s t e m .
- u
t . p r i n t l n ( c . i d ( ) ) ; }
泛型
- 不同类型间的相互替代 ?
– U
p c a s t i n g 与 多态
C l a s s A { } v
- i
d f ( A a r g ) { / / … } f ( n e w A ( ) ) ; C l a s s A { } C l a s s B { } v
- i
d f ( A a r g ) { / / … } f ( n e w B ( ) ) ; C l a s s A { } C l a s s B { } C l a s s C e x t e n d s A { } v
- i
d f ( A a r g ) { / / … } f ( n e w C ( ) ) ;
泛型
- 不同类型间的相互替代 ?
– 泛型 :
更灵活的方式
基本概念
- 泛型 (
g e n e r i c s )
– 在定义类的成员和方法时 ,
类型为可变参数
v
- i
d f ( ? a r g ) { / / … } c l a s s M y T y p e { ? m e m b e r = n u l l ; }
基本概念
- 语法
v
- i
d f ( ? a r g ) { / / … } c l a s s M y T y p e { ? m e m b e r = n u l l ; } < T > v
- i
d f ( T a r g ) { / / … } c l a s s M y T y p e < T > { T m e m b e r = n u l l ; }
E x a m p l e : A s i m p l e H
- l
d e r c l a s s
c l a s s A p p l e { } p u b l i c c l a s s H
- l
d e r { p r i v a t e A p p l e a ; p u b l i c H
- l
d e r ( A p p l e a ) { t h i s . a = a ; } p u b l i c v
- i
d s e t ( A p p l e a ) { t h i s . a = a ; } p u b l i c A p p l e g e t ( ) { r e t u r n a ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { H
- l
d e r h = n e w H
- l
d e r ( n e w A p p l e ( ) ) ; A p p l e a = h . g e t ( ) ; / / h . s e t ( " N
- t
a n A p p l e " ) ; / / E r r
- r
/ / h . s e t ( 1 ) ; / / E r r
- r
} }
E x a m p l e : A s i m p l e H
- l
d e r c l a s s
c l a s s A p p l e { } p u b l i c c l a s s H
- l
d e r < T > { p r i v a t e T a ; p u b l i c H
- l
d e r ( T a ) { t h i s . a = a ; } p u b l i c v
- i
d s e t ( T a ) { t h i s . a = a ; } p u b l i c T g e t ( ) { r e t u r n a ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { H
- l
d e r < S t r i n g > h s = n e w H
- l
d e r < S t r i n g > ( n e w S t r i n g ( “ h e l l
- ”
) ) ; S t r i n g s = h s . g e t ( ) ; H
- l
d e r < I n t e g e r > h i = n e w H
- l
d e r < I n t e g e r > ( 1 ) ; i n t I = h i . g e t ( ) ; H
- l
d e r < A p p l e > h = n e w H
- l
d e r < A p p l e > ( n e w A p p l e ( ) ) ; A p p l e a = h . g e t ( ) ; / / h . s e t ( " N
- t
a n A p p l e " ) ; / / E r r
- r
/ / h . s e t ( 1 ) ; / / E r r
- r
} }
E x a m p l e : A s i m p l e H
- l
d e r c l a s s
c l a s s A p p l e { } p u b l i c c l a s s H
- l
d e r < T > { p r i v a t e T a ; p u b l i c H
- l
d e r ( T a ) { t h i s . a = a ; } p u b l i c v
- i
d s e t ( T a ) { t h i s . a = a ; } p u b l i c T g e t ( ) { r e t u r n a ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { H
- l
d e r < A p p l e > h = n e w H
- l
d e r < A p p l e > ( n e w A p p l e ( ) ) ; A p p l e a = h . g e t ( ) ; } } c l a s s A p p l e { } p u b l i c c l a s s H
- l
d e r { p r i v a t e O b j e c t a ; p u b l i c H
- l
d e r ( O b j e c t a ) { t h i s . a = a ; } p u b l i c v
- i
d s e t ( O b j e c t a ) { t h i s . a = a ; } p u b l i c O b j e c t g e t ( ) { r e t u r n a ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { H
- l
d e r h = n e w H
- l
d e r ( n e w A p p l e ( ) ) ; A p p l e a = ( A p p l e ) h . g e t ( ) ; } }
基本概念
- 方法
– 形参 – 实参 – 类型参数
E x a m p l e : A t u p l e l i b r a r y
- T
u p l e
– 不可变数组 (
数组元素不可变 )
– 用途 :
- 函数返回多个值
- D
a t a t r a n s f e r
- b
j e c t
E x a m p l e : A t u p l e l i b r a r y
p u b l i c c l a s s T w
- T
u p l e < A , B > { p u b l i c fi n a l A fi r s t ; p u b l i c fi n a l B s e c
- n
d ; p u b l i c T w
- T
u p l e ( A a , B b ) { fi r s t = a ; s e c
- n
d = b ; } p u b l i c S t r i n g t
- S
t r i n g ( ) { r e t u r n " ( " + fi r s t + " , " + s e c
- n
d + " ) " ; } }
E x a m p l e : A t u p l e l i b r a r y
p u b l i c c l a s s T h r e e T u p l e < A , B , C > e x t e n d s T w
- T
u p l e < A , B > { p u b l i c fi n a l C t h i r d ; p u b l i c T h r e e T u p l e ( A a , B b , C c ) { s u p e r ( a , b ) ; t h i r d = c ; } p u b l i c S t r i n g t
- S
t r i n g ( ) { r e t u r n " ( " + fi r s t + " , " + s e c
- n
d + " , " + t h i r d + " ) " ; } } p u b l i c c l a s s F
- u
r T u p l e < A , B , C , D > e x t e n d s T h r e e T u p l e < A , B , C > { p u b l i c fi n a l D f
- u
r ; p u b l i c T h r e e T u p l e ( A a , B b , C c , D d ) { s u p e r ( a , b , c ) ; t h i r d = d ; } p u b l i c S t r i n g t
- S
t r i n g ( ) { r e t u r n " ( " + fi r s t + " , " + s e c
- n
d + " , " + t h i r d + " , " + f
- u
r + " ) " ; } }
E x a m p l e : A t u p l e l i b r a r y
c l a s s A p p l e { } c l a s s O r a n g e { } p u b l i c c l a s s T u p l e T e s t { s t a t i c T w
- T
u p l e < S t r i n g , I n t e g e r > f ( ) { r e t u r n n e w T w
- T
u p l e < S t r i n g , I n t e g e r > ( " h i " , 4 7 ) ; / / A u t
- b
- x
i n g } s t a t i c T h r e e T u p l e < A p p l e , S t r i n g , I n t e g e r > g ( ) { r e t u r n n e w T h r e e T u p l e < A p p l e , S t r i n g , I n t e g e r > ( n e w A p p l e ( ) , " h i " , 4 7 ) ; } s t a t i c F
- u
r T u p l e < O r a n g e , A p p l e , S t r i n g , I n t e g e r > h ( ) { r e t u r n n e w F
- u
r T u p l e < O r a n g e , A p p l e , S t r i n g , I n t e g e r > ( n e w O r a n g e ( ) , n e w A p p l e ( ) , " h i " , 4 7 ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { T w
- T
u p l e < S t r i n g , I n t e g e r > t t s i = f ( ) ; S y s t e m .
- u
t . p r i n t l n ( t t s i ) ; / / t t s i . fi r s t = " t h e r e " ; / / C
- m
p i l e e r r
- r
: fi n a l S y s t e m .
- u
t . p r i n t l n ( g ( ) ) ; S y s t e m .
- u
t . p r i n t l n ( h ( ) ) ; } }
泛型接口
- 带有类型参数的接口
p u b l i c i n t e r f a c e G e n e r a t
- r
< T > { T n e x t ( ) ; } p u b l i c c l a s s C
- ff
e e { p r i v a t e s t a t i c l
- n
g c
- u
n t e r = ; p r i v a t e fi n a l l
- n
g i d = c
- u
n t e r + + ; p u b l i c S t r i n g t
- S
t r i n g ( ) { r e t u r n g e t C l a s s ( ) . g e t S i m p l e N a m e ( ) + " " + i d ; } } p u b l i c c l a s s L a t t e e x t e n d s C
- ff
e e { } p u b l i c c l a s s M
- c
h a e x t e n d s C
- ff
e e { } p u b l i c c l a s s C a p p u c c i n
- e
x t e n d s C
- ff
e e { } p u b l i c c l a s s A m e r i c a n
- e
x t e n d s C
- ff
e e { } p u b l i c c l a s s B r e v e e x t e n d s C
- ff
e e { }
i m p
- r
t j a v a . u t i l . * ; p u b l i c c l a s s C
- ff
e e G e n e r a t
- r
i m p l e m e n t s G e n e r a t
- r
< C
- ff
e e > { p r i v a t e C l a s s [ ] t y p e s = { L a t t e . c l a s s , M
- c
h a . c l a s s , C a p p u c c i n
- .
c l a s s , A m e r i c a n
- .
c l a s s , B r e v e . c l a s s , } ; p r i v a t e s t a t i c R a n d
- m
r a n d = n e w R a n d
- m
( 4 7 ) ; p r i v a t e i n t s i z e = ; p u b l i c C
- ff
e e G e n e r a t
- r
( ) { } p u b l i c C
- ff
e e G e n e r a t
- r
( i n t s z ) { s i z e = s z ; } p u b l i c C
- ff
e e n e x t ( ) { t r y { r e t u r n ( C
- ff
e e ) t y p e s [ r a n d . n e x t I n t ( t y p e s . l e n g t h ) ] . n e w I n s t a n c e ( ) ; / / R e p
- r
t p r
- g
r a m m e r e r r
- r
s a t r u n t i m e : } c a t c h ( E x c e p t i
- n
e ) { t h r
- w
n e w R u n t i m e E x c e p t i
- n
( e ) ; } } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { C
- ff
e e G e n e r a t
- r
g e n = n e w C
- ff
e e G e n e r a t
- r
( ) ; f
- r
( i n t i = ; i < 5 ; i + + ) S y s t e m .
- u
t . p r i n t l n ( g e n . n e x t ( ) ) ; } }
/ / p u b l i c c l a s s C
- ff
e e G e n e r a t
- r
i m p l e m e n t s G e n e r a t
- r
< C
- ff
e e > p u b l i c c l a s s F i b
- n
a c c i i m p l e m e n t s G e n e r a t
- r
< I n t e g e r > { p r i v a t e i n t c
- u
n t = ; p u b l i c I n t e g e r n e x t ( ) { r e t u r n fi b ( c
- u
n t + + ) ; } p r i v a t e i n t fi b ( i n t n ) { i f ( n < 2 ) r e t u r n 1 ; r e t u r n fi b ( n
- 2
) + fi b ( n
- 1
) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { F i b
- n
a c c i g e n = n e w F i b
- n
a c c i ( ) ; f
- r
( i n t i = ; i < 1 8 ; i + + ) S y s t e m .
- u
t . p r i n t ( g e n . n e x t ( ) + " " ) ; } }
泛型方法
- 方法的参数 ,
返回值带有类型参数
- 语法
p u b l i c < T > v
- i
d f ( T x ) { / / … }
< T > 说明该方法带有类型参数 T 需要放在返回值说明之前
泛型方法
p u b l i c c l a s s G e n e r i c M e t h
- d
s < E > { E m e m b e r ; p u b l i c < T > v
- i
d f ( T x ) { S y s t e m .
- u
t . p r i n t l n ( x . g e t C l a s s ( ) . g e t N a m e ( ) ) ; } } p u b l i c c l a s s G e n e r i c M e t h
- d
s { p u b l i c < T > v
- i
d f ( T x ) { S y s t e m .
- u
t . p r i n t l n ( x . g e t C l a s s ( ) . g e t N a m e ( ) ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { G e n e r i c M e t h
- d
s g m = n e w G e n e r i c M e t h
- d
s ( ) ; g m . f ( " " ) ; g m . f ( 1 ) ; g m . f ( 1 . ) ; g m . f ( 1 . F ) ; g m . f ( ‘ c ’ ) ;g m . f ( g m ) ; } }
方法的类型参数可以与类的类型参数无关
类型推理
- 编译器推理出类型变量的值
I m p
- r
t j a v a . u t i l . * ; p u b l i c c l a s s N e w { p u b l i c s t a t i c < K , V > M a p < K , V > b u i l d ( ) { r e t u r n n e w H a s h M a p < K , V > ( ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { M a p < S t r i n g , L i s t < S t r i n g > > s = N e w . b u i l d ( ) ; } } / / D i a m
- n
d A r r a y L i s t < S t r i n g > s = n e w A r r a y L i s t < > ( ) ; H a s h M a p < S t r i n g , I n t e g e r > h = n e w H a s h M a p < > ( ) ; 1 . 由 M a p < S t r i n g , L i s t < S t r i n g > > s = N e w . b u i l d ( ) ; 推断出 b u i l d ( ) 方法中的 K = S t r i n g , V = L i s t < S t r i n g > 2 . 可以通过语法明确泛型方法调用时的类型参数 M a p < S t r i n g , L i s t < S t r i n g > > s = N e w . < S t r i n g , L i s t < S t r i n g > > M a p ( ) ;
小结
- 泛型类
- 泛型接口
- 泛型方法
p u b l i c i n t e r f a c e G e n e r a t
- r
< T > { T n e x t ( ) ; } p u b l i c c l a s s T w
- T
u p l e < A , B > { / / . . . } p u b l i c < T > v
- i
d f ( T x ) { / / … }
p u b l i c c l a s s G e n e r a t
- r
s { p u b l i c s t a t i c < T > C
- l
l e c t i
- n
< T > fi l l ( C
- l
l e c t i
- n
< T > c
- l
l , G e n e r a t
- r
< T > g e n , i n t n ) { f
- r
( i n t i = ; i < n ; i + + ) c
- l
l . a d d ( g e n . n e x t ( ) ) ; r e t u r n c
- l
l ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { C
- l
l e c t i
- n
< C
- ff
e e > c
- ff
e e = fi l l ( n e w A r r a y L i s t < C
- ff
e e > ( ) , n e w C
- ff
e e G e n e r a t
- r
( ) , 4 ) ; f
- r
( C
- ff
e e c : c
- ff
e e ) S y s t e m .
- u
t . p r i n t l n ( c ) ; C
- l
l e c t i
- n
< I n t e g e r > f n u m b e r s = fi l l ( n e w A r r a y L i s t < I n t e g e r > ( ) , n e w F i b
- n
a c c i ( ) , 1 2 ) ; f
- r
( i n t i : f n u m b e r s ) S y s t e m .
- u
t . p r i n t ( i + " , " ) ; } }
T y p e E r a s u r e
- 当给定不同的类型参数时 ,
泛型的类型是否相 同 ?
c l a s s A { } c l a s s B e x t e n d s A { } p u b l i c c l a s s T e s t { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { A r r a y L i s t < S t r i n g > s t r l i s t = n e w A r r a y L i s t < > ( ) ; A r r a y L i s t < I n t e g e r > i n t l = s t r l i s t ; A r r a y L i s t < B > b l i s t = n e w A r r a y L i s t < > ( ) ; A r r a y L i s t < A > a l i s t = b l i s t ; } } 编译错误 ! A r r a y L i s t < S t r i n g > , A r r a y L i s t < I n t e g e r > , A r r a y L i s t < B > , A r r a y L i s t < A > 是不同类型 !
T y p e E r a s u r e
- 当给定不同的类型参数时 ,
泛型的类型是否相 同 ?
– C
l a s s O b j e c t
i m p
- r
t j a v a . u t i l . * ; p u b l i c c l a s s E r a s e d T y p e E q u i v a l e n c e { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { C l a s s c 1 = n e w A r r a y L i s t < S t r i n g > ( ) . g e t C l a s s ( ) ; C l a s s c 2 = n e w A r r a y L i s t < I n t e g e r > ( ) . g e t C l a s s ( ) ; S y s t e m .
- u
t . p r i n t l n ( c 1 = = c 2 ) ; } } 输出 : t r u e !
T y p e E r a s u r e
i m p
- r
t j a v a . u t i l . * ; c l a s s F r
- b
{ } c l a s s F n
- r
k l e { } c l a s s Q u a r k < Q > { } c l a s s P a r t i c l e < P O S I T I O N , M O M E N T U M > { } p u b l i c c l a s s L
- s
t I n f
- r
m a t i
- n
{ p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { L i s t < F r
- b
> l i s t = n e w A r r a y L i s t < F r
- b
> ( ) ; M a p < F r
- b
, F n
- r
k l e > m a p = n e w H a s h M a p < F r
- b
, F n
- r
k l e > ( ) ; Q u a r k < F n
- r
k l e > q u a r k = n e w Q u a r k < F n
- r
k l e > ( ) ; P a r t i c l e < L
- n
g , D
- u
b l e > p = n e w P a r t i c l e < L
- n
g , D
- u
b l e > ( ) ; S y s t e m .
- u
t . p r i n t l n ( A r r a y s . t
- S
t r i n g ( l i s t . g e t C l a s s ( ) . g e t T y p e P a r a m e t e r s ( ) ) ) ; S y s t e m .
- u
t . p r i n t l n ( A r r a y s . t
- S
t r i n g ( m a p . g e t C l a s s ( ) . g e t T y p e P a r a m e t e r s ( ) ) ) ; S y s t e m .
- u
t . p r i n t l n ( A r r a y s . t
- S
t r i n g ( q u a r k . g e t C l a s s ( ) . g e t T y p e P a r a m e t e r s ( ) ) ) ; S y s t e m .
- u
t . p r i n t l n ( A r r a y s . t
- S
t r i n g ( p . g e t C l a s s ( ) . g e t T y p e P a r a m e t e r s ( ) ) ) ; } } 输出 : [ E ] [ K , V ] [ Q ] [ P O S I T I O N , M O M E N T U M ]
T y p e E r a s u r e
- 泛型是如何实现的 ?
- A
r r a y L i s t < S t r i n g > 与 A r r a y L i s t < I n t e g e r > 的区 别在哪里 ?
T y p e E r a s u r e
- 类型擦除 (
T y p e E r a s u r e ) ,
– T
仅作为占位符 , 不包含任何具体类型的信息
– 所有 T
类型的对象引用最终实现为 O b j e c t 对象引用
T y p e E r a s u r e
c l a s s H a s F { p u b l i c v
- i
d f ( ) { S y s t e m .
- u
t . p r i n t l n ( " H a s F . f ( ) " ) ; } } c l a s s M a n i p u l a t
- r
< T > { p r i v a t e T
- b
j ; p u b l i c M a n i p u l a t
- r
( T x ) {
- b
j = x ; } / / E r r
- r
: c a n n
- t
fi n d s y m b
- l
: m e t h
- d
f ( ) : p u b l i c v
- i
d m a n i p u l a t e ( ) {
- b
j . f ( ) ; } } p u b l i c c l a s s M a n i p u l a t i
- n
{ p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { H a s F h f = n e w H a s F ( ) ; M a n i p u l a t
- r
< H a s F > m a n i p u l a t
- r
= n e w M a n i p u l a t
- r
< H a s F > ( h f ) ; m a n i p u l a t
- r
. m a n i p u l a t e ( ) ; } }
T y p e E r a s u r e
p u b l i c c l a s s E r a s e d < T > { p r i v a t e fi n a l i n t S I Z E = 1 ; p u b l i c v
- i
d f ( O b j e c t a r g ) { i f ( a r g i n s t a n c e
- f
T ) { } / / c
- m
p i l e e r r
- r
T v a r = n e w T ( ) ; / / c
- m
p i l e e r r
- r
T [ ] a r r a y = n e w T [ S I Z E ] ; / / c
- m
p i l e e r r
- r
} }
T y p e E r a s u r e
- T
y p e E r a s u r e 实现原理 1 :
– 所有引用最后都变为 O
b j e c t 引用
– 编译器自动添加 D
- w
n c a s t i n g 代码
c l a s s A p p l e { } p u b l i c c l a s s H
- l
d e r < T > { p r i v a t e T a ; p u b l i c H
- l
d e r ( T a ) { t h i s . a = a ; } p u b l i c v
- i
d s e t ( T a ) { t h i s . a = a ; } p u b l i c T g e t ( ) { r e t u r n a ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { H
- l
d e r < A p p l e > h = n e w H
- l
d e r < A p p l e > ( n e w A p p l e ( ) ) ; A p p l e a = h . g e t ( ) ; } } c l a s s A p p l e { } p u b l i c c l a s s H
- l
d e r { p r i v a t e O b j e c t a ; p u b l i c H
- l
d e r ( O b j e c t a ) { t h i s . a = a ; } p u b l i c v
- i
d s e t ( O b j e c t a ) { t h i s . a = a ; } p u b l i c O b j e c t g e t ( ) { r e t u r n a ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { H
- l
d e r h = n e w H
- l
d e r ( n e w A p p l e ( ) ) ; A p p l e a = ( A p p l e ) h . g e t ( ) ; } }
生成相同的机器代码 编译器在 g e t ( ) 返回处自动添加了类型转换代码
T y p e E r a s u r e
- T
y p e E r a s u r e 的实现原理 2 :
– 编译器只做静态检查
c l a s s A { } c l a s s B e x t e n d s A { } p u b l i c c l a s s T e s t { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { A r r a y L i s t < S t r i n g > s t r l i s t = n e w A r r a y L i s t < > ( ) ; A r r a y L i s t < I n t e g e r > i n t l = s t r l i s t ; A r r a y L i s t < B > b l i s t = n e w A r r a y L i s t < > ( ) ; A r r a y L i s t < A > a l i s t = b l i s t ; } }
1 . 编译器通过静态检查报错 ( A r r a y L i s t < S t r i n g > 与 A r r a y L i s t < I n t e g e r > 类型不同 ) 2 . 但实际存储中 , 无论 < S t r i n g > 还是 < I n t e g e r > 都存储的是 O b j e c t 类型的引用
T y p e E r a s u r e
- T
y p e E r a s u r e
– 类型变量仅仅对编译器的静态检查有用 – 当通过静态检查 ,
所有类型参数被擦除
T y p e E r a s u r e
- 如何解决 T
y p e E r a s u r e 带来的问题 ?
– C
l a s s 对象
p u b l i c c l a s s E r a s e d < T > { p r i v a t e fi n a l i n t S I Z E = 1 ; p u b l i c s t a t i c v
- i
d f ( ) { T v a r = n e w T ( ) ; / / c
- m
p i l e e r r
- r
} }
p u b l i c c l a s s T y p e C a p t u r e < T > { C l a s s < T > k i n d ; p u b l i c T y p e C a p t u r e ( C l a s s < T > k i n d ) { t h i s . k i n d = k i n d ; } p u b l i c T f ( ) { T r = n u l l ; t r y { r = k i n d . n e w I n s t a n c e ( ) ; } c a t c h ( E x c e p t i
- n
e ) { S y s t e m .
- u
t . p r i n t l n ( " f a i l " ) ; } r e t u r n r ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { T y p e C a p t u r e < S t r i n g > c = n e w T y p e C a p t u r e < > ( S t r i n g . c l a s s ) ; S y s t e m .
- u
t . p r i n t l n ( c . f ( ) ) ; } }
T y p e E r a s u r e
- 如何解决 T
y p e E r a s u r e 带来的问题 ?
p u b l i c c l a s s H a s F { p u b l i c v
- i
d f ( ) { S y s t e m .
- u
t . p r i n t l n ( " H a s F . f ( ) " ) ; } } c l a s s M a n i p u l a t
- r
< T > { p r i v a t e T
- b
j ; p u b l i c M a n i p u l a t
- r
( T x ) {
- b
j = x ; } / / E r r
- r
: c a n n
- t
fi n d s y m b
- l
: m e t h
- d
f ( ) : p u b l i c v
- i
d m a n i p u l a t e ( ) {
- b
j . f ( ) ; } } p u b l i c c l a s s M a n i p u l a t i
- n
{ p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { H a s F h f = n e w H a s F ( ) ; M a n i p u l a t
- r
< H a s F > m a n i p u l a t
- r
= n e w M a n i p u l a t
- r
< H a s F > ( h f ) ; m a n i p u l a t
- r
. m a n i p u l a t e ( ) ; } } c l a s s M a n i p u l a t
- r
< T e x t e n d s H a s F > { p r i v a t e T
- b
j ; p u b l i c M a n i p u l a t
- r
( T x ) {
- b
j = x ; } p u b l i c v
- i
d m a n i p u l a t e ( ) {
- b
j . f ( ) ; } }
被限定的类型参数
- 限定类型参数的范围
– 语法 : – 表示类型参数 T
只能是 B类型或者 B的子类型
– 作用 :
静态检查时 , 可以合法引用 T 的方法 ( 但最 终仍然是 O b j e c t )
– 多个限定类型
- 如果有类和接口 ,
类应该出现在第一个位置
c l a s s A < T e x t e n d s B > { / / … } c l a s s A < T e x t e n d s B & C > { / / … }
被限定的类型参数
i n t e r f a c e H a s C
- l
- r
{ j a v a . a w t . C
- l
- r
g e t C
- l
- r
( ) ; } c l a s s C
- l
- r
e d < T e x t e n d s H a s C
- l
- r
> { T i t e m ; C
- l
- r
e d ( T i t e m ) { t h i s . i t e m = i t e m ; } T g e t I t e m ( ) { r e t u r n i t e m ; } / / T h e b
- u
n d a l l
- w
s y
- u
t
- c
a l l a m e t h
- d
: j a v a . a w t . C
- l
- r
c
- l
- r
( ) { r e t u r n i t e m . g e t C
- l
- r
( ) ; } } c l a s s D i m e n s i
- n
{ p u b l i c i n t x , y , z ; } / / M u l t i p l e b
- u
n d s : c l a s s C
- l
- r
e d D i m e n s i
- n
< T e x t e n d s D i m e n s i
- n
& H a s C
- l
- r
> { T i t e m ; C
- l
- r
e d D i m e n s i
- n
( T i t e m ) { t h i s . i t e m = i t e m ; } T g e t I t e m ( ) { r e t u r n i t e m ; } j a v a . a w t . C
- l
- r
c
- l
- r
( ) { r e t u r n i t e m . g e t C
- l
- r
( ) ; } i n t g e t X ( ) { r e t u r n i t e m . x ; } i n t g e t Y ( ) { r e t u r n i t e m . y ; } i n t g e t Z ( ) { r e t u r n i t e m . z ; } }
通配符
c l a s s F r u i t { } c l a s s A p p l e e x t e n d s F r u i t { } c l a s s O r a n g e e x t e n d s F r u i t { } p u b l i c c l a s s T e s t { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { L i s t < A p p l e > a l i s t = n e w A r r a y L i s t < A p p l e > ( ) ; / / c
- m
p i l e e r r
- r
/ / L i s t < F r u i t > fl i s t = n e w A r r a y L i s t < A p p l e > ( ) ; } }
如何表达 A r r a y L i s t 中的元素是 F r u i t 的某个子类 ?
通配符
c l a s s F r u i t { } c l a s s A p p l e e x t e n d s F r u i t { } c l a s s O r a n g e e x t e n d s F r u i t { } p u b l i c c l a s s T e s t { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { L i s t < A p p l e > a l i s t = n e w A r r a y L i s t < A p p l e > ( ) ; / / c
- m
p i l e e r r
- r
/ / L i s t < F r u i t > fl i s t = n e w A r r a y L i s t < A p p l e > ( ) ; L i s t < ? e x t e n d s F r u i t > fl i s t = n e w A r r a y L i s t < A p p l e > ( ) ; / / C
- m
p i l e E r r
- r
: c a n ’ t a d d a n y t y p e
- f
- b
j e c t : / / fl i s t . a d d ( n e w A p p l e ( ) ) ; / / fl i s t . a d d ( n e w F r u i t ( ) ) ; / / fl i s t . a d d ( n e w O b j e c t ( ) ) ; fl i s t . a d d ( n u l l ) ; / / L e g a l b u t u n i n t e r e s t i n g / / We k n
- w
t h a t i t r e t u r n s a t l e a s t F r u i t : F r u i t f = fl i s t . g e t ( ) ; } }
通配符
- 类型参数为某个 B的子类型
- 具体是哪一个无法确定
- L
i s t < ? e x t e n d s F r u i t >
– 无法 a
d d 任何对象
- L
i s t 中存储的对象类型无法确定
– 可以 g
e t 对象
- F
r u i t 类型
< ? e x t e n d s B >
通配符
- 类型参数为某个 B的父类型
- 具体是哪一个无法确定
- L
i s t < ? s u p e r A p p l e >
– 无法 g
e t 任何对象
- 无法确定是哪个父类
– 可以 a
d d A p p l e 的子类对象
< ? s u p e r B >
i m p
- r
t j a v a . u t i l . * ; p u b l i c c l a s s S u p e r T y p e Wi l d c a r d s { s t a t i c v
- i
d w r i t e T
- (
L i s t < ? s u p e r A p p l e > a p p l e s ) { a p p l e s . a d d ( n e w A p p l e ( ) ) ; a p p l e s . a d d ( n e w J
- n
a t h a n ( ) ) ; / / a p p l e s . a d d ( n e w F r u i t ( ) ) ; / / E r r
- r
} }
总结
- T
y p e E r a s u r e
– 类型变量仅仅对编译器的静态检查有用 – 当通过静态检查 ,
所有类型参数被擦除
- 被限制的类型参数
- 通配符