如何将参数传递给存在类型的方法?

时间:2015-08-12 16:20:56

标签: scala existential-type

Scala代码:

class AAA[T] {
  def hhh(t: T) = println(t)
}

val a: AAA[_] = new AAA()

我可以传递给a.hhh什么?我试过了:

val b: Any = 111
a.hhh(b) // compilation error!

但它有编译错误。如果代码的第一部分无法更改,我该如何编写第二部分代码?

2 个答案:

答案 0 :(得分:2)

你所能做的就是把它包装成类似的东西:

def ggg[T](t: T)= a.asInstanceOf[AAA[T]].hhh(t)

ggg(111) // prints 111

答案 1 :(得分:1)

好吧,如果AAA[T]为未知类型T,则需要T。很明显为什么val b: Any = 111不起作用:因为T可以是任何东西,例如StringT

因此要传递某些内容,它必须同时包含所有类型Nothing,因此它只能有一种类型:val b: Nothing = throw new Exception a.hhh(b) // compiles!

hhh

对于此Nothing签名,这将始终抛出异常,因为没有类型List[T]的实际值。但是你可以通过修改它来获得更合理的东西:例如以名称取名,取Nil(在这种情况下$cookies = tempnam( sys_get_temp_dir(), 'CDL' ); // for cURL function getCurlData( $url, $data, $post = false, $http_build_query = false ) { global $cookies; $ch = curl_init(); curl_setopt( $ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT'] ); curl_setopt( $ch, CURLOPT_COOKIEFILE, $cookies ); curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookies ); curl_setopt( $ch, CURLOPT_TIMEOUT, 40000 ); curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_URL, $url ); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false ); curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false ); curl_setopt( $ch, CURLOPT_REFERER, $url ); if( $post ) { curl_setopt( $ch, CURLOPT_POST, true ); if( $http_build_query ) { curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $data ) ); } else { curl_setopt( $ch, CURLOPT_POSTFIELDS, $data ); } } $result = curl_exec( $ch ); curl_close( $ch ); return $result; } 可以通过),等等。