मैं समझने की कोशिश कर रहा हूं कि स्काला केस क्लासेस के साथ क्या करता है जो उन्हें किसी भी प्रकार की मिटा चेतावनी टाइप करने के लिए प्रतिरक्षा बनाता है।स्कैला: केस क्लास अनप्ली बनाम मैन्युअल कार्यान्वयन और टाइप एरर
मान लें कि हमारे पास निम्न, सरल वर्ग संरचना है। यह मूल रूप से एक Either
है:
abstract class BlackOrWhite[A, B]
case class Black[A,B](val left: A) extends BlackOrWhite[A,B]
case class White[A,B](val right: B) extends BlackOrWhite[A,B]
और तुम इस तरह इसका इस्तेमाल करने की कोशिश कर रहे हैं:
object Main extends App {
def echo[A,B] (input: BlackOrWhite[A,B]) = input match {
case Black(left) => println("Black: " + left)
case White(right) => println("White: " + right)
}
echo(Black[String, Int]("String!"))
echo(White[String, Int](1234))
}
सब कुछ संकलित करता है तथा बिना किसी समस्या के चलाता है। हालांकि, जब मैं unapply
विधि को स्वयं लागू करने का प्रयास करता हूं, तो संकलक चेतावनी फेंकता है।
abstract class BlackOrWhite[A, B]
case class Black[A,B](val left: A) extends BlackOrWhite[A,B]
object White {
def apply[A,B](right: B): White[A,B] = new White[A,B](right)
def unapply[B](value: White[_,B]): Option[B] = Some(value.right)
}
class White[A,B](val right: B) extends BlackOrWhite[A,B]
संकलन कि -unchecked
झंडा मुद्दों निम्न चेतावनी के साथ:
[info] Compiling 1 Scala source to target/scala-2.9.1.final/classes...
[warn] src/main/scala/Test.scala:41: non variable type-argument B in type pattern main.scala.White[_, B] is unchecked since it is eliminated by erasure
[warn] case White(right) => println("White: " + right)
[warn] ^
[warn] one warning found
[info] Running main.scala.Main
अब, मैं प्रकार विलोपन को समझते हैं और मैं करने के लिए कोशिश की है मैं ऊपर ही Main
वर्ग के साथ निम्न वर्ग संरचना का इस्तेमाल किया Manifests
(अभी तक कोई फायदा नहीं हुआ) के साथ चेतावनी के आसपास जाओ, लेकिन दो कार्यान्वयन के बीच क्या अंतर है? क्या केस क्लास ऐसा कुछ कर रहे हैं जिसमें मुझे जोड़ने की ज़रूरत है? क्या इसे Manifests
से घिराया जा सकता है?
मैं भी -Xprint:typer
ध्वज के साथ स्केला संकलक के माध्यम से मामले वर्ग कार्यान्वयन चल चालू कोशिश की, लेकिन unapply
विधि काफी है कि मैं उम्मीद दिखता है:
case <synthetic> def unapply[A >: Nothing <: Any, B >: Nothing <: Any](x$0: $iw.$iw.White[A,B]): Option[B] = if (x$0.==(null))
scala.this.None
else
scala.Some.apply[B](x$0.right);
अग्रिम धन्यवाद
आप कर रहे हैं स्कैला के नवीनतम संस्करण का उपयोग करके? मैं आपकी समस्या को पुन: पेश नहीं कर सकता, और कुछ महीने पहले इस संबंधित प्रश्न ने आपके लिए एक संकलक बग के रूप में एक समान समस्या निर्धारित की। http://stackoverflow.com/questions/7008428/difference देखें -बेटवीन-होम-निर्मित-एक्स्ट्रैक्टर-एंड-केस-क्लास-एक्सट्रैक्टर – Destin
मैं 2.9.1.फिनल (Xubuntu 11.10 पर, यदि यह मायने रखता है) का उपयोग कर रहा है – Nycto