Tôi đã cố gắng trả lời câu hỏi this, như tôi nghĩ tôi biết câu trả lời. Hóa ra, tôi không biết khá đủ:/Tại sao `.asInstanceOf` đôi khi ném, và đôi khi không?
Dưới đây là một thử nghiệm tôi đã thực hiện:
class Inst[T] {
def is(x: Any) = scala.util.Try { as(x) }.isSuccess
def as(x: Any): T = x.asInstanceOf[T]
}
scala> new Inst[String].is(3)
res17: Boolean = true
scala> new Inst[String].as(3)
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
... 33 elided
gì đang xảy ra ở đây? Tại sao chỉ cuộc gọi thứ hai đến số as
ném, nhưng không phải cuộc gọi đầu tiên?
Không, đây dường như không để giải thích nhiều: tôi đã thay đổi định nghĩa 'is' thành:' def là (x: Any) = scala.util.Try {as (x) .toString} .isSuccess', và nó vẫn trả về 'true' (nghĩa là, cast không ném). Thậm chí này 'def là (x: Bất kỳ) = scala.util.Try {println (như (x) ToString)} .isSuccess;' hạnh phúc in ra "3" và trả về true: -/ – Dima
Xin xem chỉnh sửa của tôi –
Ah, bây giờ nó có ý nghĩa, cảm ơn! 'is' không biết' T' là gì, vì vậy nó xử lý đối số là 'Bất kỳ'. Tôi đã thử điều này: 'trait Foo {def foo = ??? } lớp Inst [T <: Foo] {def là (x: Any) = scala.util.Thử {as (x) .foo} .isSuccess; def as (x: Any): T = x.asInstanceOf [T]; } '. Bây giờ 'mới Inst [Foo] .is (3)' trả về 'false' như mong đợi. – Dima