2010/04/21

scala cast

Jython でできたら Scala でもできるべ JK、と思ったら失敗しやんの
というお話

同じようにしようと思ったんですね、Scala で
scala> import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.SSLSocketFactory

scala> val fc = SSLSocketFactory.getDefault
fc: javax.net.SocketFactory = com.sun.net.ssl.internal.ssl.SSLSocketFactoryImpl@10c6406

scala> val sock = fc.createSocket("www.google.com", 443)
sock: java.net.Socket = 17aa961[SSL_NULL_WITH_NULL_NULL: Socket[addr=www.google.com/66.249.89.99,port=443,localport=57185]]

scala> sock.startHandshake
<console>:8: error: value startHandshake is not a member of java.net.Socket
sock.startHandshake
^

scala>
java.net.Socket には startHandshake なんて無いと

あれー、と思って調べてみたら
Java の場合は Socket 作るときにキャストしてたんです
なんで調べてみましたところ
型キャスト - うなの日記
.asInstanceOf でキャストするらしい

とわけで仕切り直し
scala> import javax.net.ssl.SSLSocket                                 
import javax.net.ssl.SSLSocket

scala> val ssl_sock = fc.createSocket("www.google.com", 443).asInstanceOf[javax.net.ssl.SSLSocket]
ssl_sock: javax.net.ssl.SSLSocket = 5b55a9[SSL_NULL_WITH_NULL_NULL: Socket[addr=www.google.com/66.249.89.104,port=443,localport=51395]]

scala> ssl_sock.startHandshake

scala> val session = ssl_sock.getSession
session: javax.net.ssl.SSLSession = [Session-1, SSL_RSA_WITH_RC4_128_SHA]

scala> session.getPeerCertificates
res3: Array[java.security.cert.Certificate] =
Array([
[
Version: V3
Subject: CN=www.google.com, O=Google Inc, L=Mountain View, ST=California, C=US
Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

Key: Sun RSA public key, 1024 bits
modulus: 16360039926653679142684174795487342200966220249542631283272411000230225514996552443305086682233800494025854567816692732625...
scala>
取れた!!

Scala の方が Java に対して素直なんですかね
何故 Jython でキャストが不要なのか良く分からず
どのくらい手を加えているのかっつーことなんでしょうか

0 件のコメント:

コメントを投稿