복붙노트

[SCALA] int로는 null이 될 수없는 경우, null.asInstanceOf [지능]은 무엇을 의미합니까?

SCALA

int로는 null이 될 수없는 경우, null.asInstanceOf [지능]은 무엇을 의미합니까?

테스트로, 나는이 코드를 썼다 :

object Ambig extends App {
  def f( x:Int    ) { println("Int"   ) }
  def f( x:String ) { println("String") }
  f( null.asInstanceOf[Int   ] )
  f( null.asInstanceOf[String] )
  f(null)
}

나는 F의 마지막 호출 ()에서 오류가 발생하는 기대가 모호한 것을 말하고 있었다. 컴파일러는 그것을 인정하고,이 출력을 생성 :

Int
String
String

F의 전용 버전이 F (널)에 대한 작품 F (: 문자열 X) 인 것을, 그래서 지금은,이 지능은 AnyRef 아니라는 사실과 관련이있다 같은데요. int로는 null이 될 수없는 경우 그러나, null.asInstanceOf [지능]은 무엇을 의미합니까? REPL은 타입은 int 말한다 :

scala> :type null.asInstanceOf[Int]
Int

하지만 난 정말 어떻게 작동하는지 볼 수 없습니다. 내가 int로 문자열을 캐스팅하려고하면 결국, 모든 지옥 나누기 느슨한 :

scala> "foo".asInstanceOf[Int]
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
    at scala.runtime.BoxesRunTime.unboxToInt(Unknown Source)
        ...

의 예상되는 것을 물론 - "foo는"은 지능으로 할 수 없습니다. 그러나, 왜있는 int 작업에 널 (null)을 어느 쪽도 널 캐스팅합니까? 아마도 어떤 형태 권투하지만, 형은 여전히 ​​null 일 수 없습니다 INT,은 ...

나는 무엇을 놓치고?

해결법

  1. ==============================

    1.int로 널 캐스팅의 동작이 수행되는 상황에 따라 달라집니다.

    int로 널 캐스팅의 동작이 수행되는 상황에 따라 달라집니다.

    당신이 int로 널 캐스팅 경우 우선, 실제로 값이 널 (null) 인 박스의 정수를 의미한다. 예상 유형 상관 어디 컨텍스트에서 식을 넣을 경우 (때문에 JVM 바이트 코드에서, 장면 뒤에 객체로 변환되는 동일한 참조하여 원시 형과 참조 형식을 참조 할 수있는 방법은 없습니다) 이 값은 상기 변환되지 않은 -에 println은 (null.asInstanceOf [순수 INT]) 널 (null)을 출력하는 이유이다.

    그러나 원시 지능 (자바 INT)이 예상된다 당신이 상황에서이 같은 박스 정수 값을 사용하는 경우, 그것은 원시적으로 변환됩니다 null가 (참조 형식에 대한 기본 값으로) (0에 기본 변환 프리미티브 타입에 대한 값).

    일반적인 방법이 캐스트를 수행하면, 자연스럽게, 당신은 널을 다시 얻을.

    상관 값은 이전과 원시적으로 변환되어야한다 :이 방법은 전문화 된 경우에는, 그 후 리턴 형 (이 경우 원시적 정수)의 지능은 널되도록한다.

    따라서, 실행 :

    object Test extends App {
      println(null.asInstanceOf[Int])
    
      def printit(x: Int) = println(x)
    
      printit(null.asInstanceOf[Int])
    
      def nullint[T] = null.asInstanceOf[T]
    
      println(nullint[Int])
    
      def nullspecint[@specialized(Int) T] = null.asInstanceOf[T]
    
      println(nullspecint[Int])
    }
    

    생산 :

    null
    0
    null
    0
    
  2. ==============================

    2.여기에 일이있어 : asInstanceOf 이해가 필요가 없습니다. 어떤이 방법을 수행하는 것은 당신이 무슨 말을하는지 STOP 만드는 SENSE, 신뢰에 컴파일러에게하는 것입니다.

    여기에 일이있어 : asInstanceOf 이해가 필요가 없습니다. 어떤이 방법을 수행하는 것은 당신이 무슨 말을하는지 STOP 만드는 SENSE, 신뢰에 컴파일러에게하는 것입니다.

    이제, 당신이, 0을 반환 asInstanceOf하지 AnyVal에 AnyRef에서 작동하기 때문이다 그 이유를 알고 싶은 경우. AnyVal인가하면 대신 박스형 버전을 사용하는 것, 그리고 박스 널 값 0을 가진다.

  3. ==============================

    3.그냥 자동으로 0으로 변환하는 것 같습니다 :

    그냥 자동으로 0으로 변환하는 것 같습니다 :

    scala> null.asInstanceOf[Int]
    res0: Int = 0
    

    그리고 물론, 0, 달리 널의, int로 할 수있다.

  4. ==============================

    4.첫째, 우리는 모두 우리가 scala.Int에 할당 널 (null)이 http://www.scala-lang.org/api/current/index.html#scala.Null에 설명 할 수 없기 때문에 동의

    첫째, 우리는 모두 우리가 scala.Int에 할당 널 (null)이 http://www.scala-lang.org/api/current/index.html#scala.Null에 설명 할 수 없기 때문에 동의

    우리가에 println 않는 경우 둘째, 왜 (null.asInstanceOf [지능])는, 널 (null)을 제공? 이 때문에에 println의 구현이다. 그것은 궁극적 인 자바 한 String.valueOf 메소드를 호출

    return (obj == null) ? "null" : obj.toString();
    

    당신이 할 경우 null.asInstanceOf은 [지능] == 셸에서 널 (null), 그것은 true를 돌려줍니다하지만 "유형의 지능과 널은 항상 false를 얻을 것 '=='사용의 값을 비교"고 반대 경고를 제공합니다. 나는 이것이 스칼라의 타입 삭제에 문제가 될 것 같아요.

    null.asInstanceOf의 캐스팅 [지능]가 실제로 아직 발생하지 않도록에 println을하는 만하는 scala.Any 유형을 필요로한다. 우리는 당신이 null.asInstanceOf int로 [지능]을 할당 할 때, 캐스트 스칼라의 삭제의 의미에 따라 런타임에 일어나는 것을 기억해야하고, 그것은 0을 할당 그래서.

    스칼라 당신을 위해 암시 적 변환을하고 있기 때문에 그건 그렇고, 당신은 여전히 ​​모든 컴파일 오류없이 F (널)을 할 수있다

     null -> java.lang.Integer -> scala.Int
    

    그러나, 당신은 런타임에 불면 볼 수 있습니다.

  5. from https://stackoverflow.com/questions/10749010/if-an-int-cant-be-null-what-does-null-asinstanceofint-mean by cc-by-sa and MIT license