मैं this प्रश्न का उत्तर देने का प्रयास कर रहा था, जैसा कि मैंने सोचा था कि मुझे जवाब पता था। बाहर कर देता है, मैं काफी पर्याप्त नहीं पता था:कभी-कभी '.asInstanceOf` क्यों फेंकता है, और कभी-कभी नहीं?
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
यहाँ क्या हो रहा है:/
यहाँ एक परीक्षण मैंने किया है है? as
पर केवल दूसरी कॉल क्यों फेंकती है, लेकिन पहले नहीं?
नहीं, यह प्रतीत नहीं होता अधिक व्याख्या करने के लिए: मैंने 'is' परिभाषा को बदल दिया है:' def है (x: Any) = scala.util.Try {as (x) .toString} .isSuccess', और यह अभी भी 'सत्य' देता है (यानी, कास्ट फेंक नहीं है)। यहां तक कि यह 'def है (x: Any) = scala.util.Try {println (as (x) .toString)} .isSuccess;' खुशी से प्रिंट करता है "3" और सत्य देता है: -/ – Dima
कृपया मेरा संपादन देखें –
आह, अब समझ में आता है, धन्यवाद! 'है 'नहीं जानता कि' टी' क्या है, इसलिए यह तर्क को' किसी भी 'के रूप में मानता है। मैंने यह कोशिश की: 'विशेषता फू {def foo = ??? } कक्षा इंस्टेंट [टी <: फू] {डीफ़ है (एक्स: कोई भी) = scala.util.Try {as (x) .foo} .isSuccess; के रूप में def (x: कोई भी): टी = x.asInstanceOf [टी]; } '। अब 'नया इंस्टेंट [फू] .is (3)' अपेक्षित के रूप में 'झूठा 'लौटाता है। – Dima