/ / स्काला: एब्सट्रैक्ट टाइप पैटर्न A को अनचेक किया जाता है क्योंकि इसे इरेज़र द्वारा समाप्त किया जाता है - स्केला, जेनरिक, फ़ंक्शनल-प्रोग्रामिंग, टाइप-इरेज़र, स्काला-टेम्प्लेट

स्कैला: अमूर्त प्रकार पैटर्न ए अनचेक किया जाता है क्योंकि इसे मिटाकर समाप्त किया जाता है - स्कैला, जेनेरिक, कार्यात्मक-प्रोग्रामिंग, टाइप-एरर, स्कैला-टेम्पलेट

मैं फ़ंक्शन लिख रहा हूं जो केवल निश्चित प्रकार के अपवादों को पकड़ सकता है।

def myFunc[A <: Exception]() {
try {
println("Hello world") // or something else
} catch {
case a: A => // warning: abstract type pattern A is unchecked since it is eliminated by erasure
}
}

ऐसे मामले में jvm प्रकार के क्षरण को बायपास करने का सबसे अच्छा तरीका क्या है?

उत्तर:

उत्तर № 1 के लिए 17

आप उपयोग कर सकते हैं ClassTag जैसे की यह जवाब.

लेकिन मैं इस दृष्टिकोण को पसंद करता हूं:

def myFunc(recover: PartialFunction[Throwable, Unit]): Unit = {
try {
println("Hello world") // or something else
} catch {
recover
}
}

उपयोग:

myFunc{ case _: MyException => }

का उपयोग करते हुए ClassTag:

import scala.reflect.{ClassTag, classTag}

def myFunc[A <: Exception: ClassTag](): Unit = {
try {
println("Hello world") // or something else
} catch {
case a if classTag[A].runtimeClass.isInstance(a) =>
}
}

ध्यान दें कि सामान्य रूप से आपको उपयोग करना चाहिए Try साथ में recover तरीका: Try ही पकड़ेंगे NonFatal अपवाद नहीं।

def myFunc(recover: PartialFunction[Throwable, Unit]) = {
Try {
println("Hello world") // or something else
} recover {
recover
}.get // you could drop .get here to return `Try[Unit]`
}

जवाब के लिए 2 № 2

हर प्रकार की जाँच के लिए (उदा। case a: A) JVM को इसकी आवश्यकता है class जाँच करने के लिए ऑब्जेक्ट। आपके मामले में जेवीएम के पास वर्ग वस्तु नहीं है, क्योंकि A एक चर प्रकार पैरामीटर है। हालाँकि, आप इसके बारे में अतिरिक्त जानकारी प्राप्त कर सकते हैं A अनुमान से Manifest[A] सेवा मेरे myFunc। एक आशुलिपि के रूप में आप बस जोड़ सकते हैं : Manifest आपके प्रकार की घोषणा A:

def myFunc[A <: Exception : Manifest]() {
try {
println("Hello world") // or something else
} catch {
case a: A => // warning: abstract type pattern A is unchecked since it is eliminated by erasure
}
}