2010-11-26 16 views
6

मैं स्कैला को https://gist.github.com/319827 को फिर से लिखने की कोशिश कर रहा हूं। लेकिन मैं इसे संकलित नहीं कर सकता। सही वाक्यविन्यास क्या है?स्कैला, उन्नत जेनेरिक विस्तार

त्रुटि मैं allways हो रही है:

वर्ग प्रकार की आवश्यकता है, लेकिन java.util.Comparator [_>: java.lang.Comparable [java.lang.Object]] पाया

स्रोत:

package v6ak.util 

import java.util.Comparator 

object NaturalComparator extends Comparator[_ >: Comparable[Object]]{ 

    override def compare(o1:Comparable[Object], o2:Comparable[Object]) = { 
     if(o1==null || o2==null){ 
      throw new NullPointerException("Comparing null values is not supported!"); 
     } 
     o1.compareTo(o2); 
    } 

} 

उत्तर

2

मैं और अधिक अनुभव और solved it के साथ समस्या को लौटा दिया है, लगता है कि बेहतर हो सकता है।

package v6ak.util 

import java.util.Comparator 

object NaturalComparator extends Comparator[Comparable[Any]]{ 

    def apply[T]() = asInstanceOf[Comparator[T]] 

    override def compare(o1:Comparable[Any], o2:Comparable[Any]) = { 
     if(o1 == null || o2 == null){ 
      throw new NullPointerException("Comparing null values is not supported!") 
     } 
     o1 compareTo o2 
    } 

} 
+0

यह सुरक्षित नहीं है, तो आपको कुछ रनटाइम त्रुटियां मिल सकती हैं ... – linehrr

+0

आप सही हैं, लागू विधि कुछ भी लागू नहीं करती है जैसे <टी तुलनात्मक >। लेकिन यह बदला जा सकता है। – v6ak

14

A extends B स्केला में A<:B लिखा है A>:B नहीं

वैसे, स्केला प्रकार प्रणाली अपने कोड

package v6ak.util 

import java.util.Comparator 

class NaturalComparator[T <: Comparable[T]] extends Comparator[T] { 
    override def compare(o1: T, o2: T) = { 
    if (o1 == null || o2 == null) { 
     throw new NullPointerException("Comparing null values is not supported!"); 
    } 
    o1.compareTo(o2); 
    } 
} 

object StringComparator extends NaturalComparator[String] 

object Examples { 
    StringComparator.compare("a", "b") 
    StringComparator.compare(2, "b") // error 
} 
+0

ठीक है, यह बिल्कुल सही कोड नहीं है। मैं वास्तव में विशेषज्ञता से नफरत करता हूं (जैसे ऑब्जेक्ट पास्कल में विशेषज्ञता)। – v6ak

+0

आप कम विशिष्ट कोड लिख सकते हैं लेकिन आप संकलन समय पर प्रकार की सुरक्षा खो देंगे। क्या आप वास्तव में 'फ़ाइल' के साथ 'दिनांक' की तुलना करने के लिए कोड लिखने की अनुमति देना चाहते हैं जो केवल रनटाइम पर विफल हो जाएगा? – shellholic

+0

हम्म, लेकिन यह मूल जावा कोड का मामला नहीं है। मुझे लगता है कि मैं स्कैला में जावा कोड के समान कुछ लिख सकता हूं, लेकिन यह बहुत अच्छा नहीं है। – v6ak

2

खैर में पर्याप्त शक्तिशाली वस्तु के उपयोग से बचने के लिए (स्केला में AnyRef) है, तो आप उस जावा संस्करण के साथ कुछ गड़बड़ कर दिया। ध्यान दें कि आप तुलनात्मक < तुलनात्मक < ऑब्जेक्ट >> का एक उदाहरण बनाते हैं और आप इसे वाइल्डकार्ड के साथ मानने के लिए असाइन करते हैं - किसके लिए? आप उस चर को और कुछ भी निर्दिष्ट नहीं करेंगे। बात नहीं कर रहा है कि अपने getInstance भी यह सब कुछ देता है, जबकि एक ही तुलनाकारी wildecards परिभाषित करता है, < तुलनीय < वस्तु >>

तो: हालांकि मैं

object NaturalComparator extends Comparator[Comparable[Object]]{ 
    override def compare(o1:Comparable[Object], o2:Comparable[Object]) = { 
     if(o1 == null || o2 == null){ 
      throw new NullPointerException("Comparing null values is not supported!"); 
     } 
     o1.compareTo(o2); 
    } 
} 
+0

यह एक ऐसा तरीका है जो एक उदाहरण प्राप्त करने और विभिन्न प्रकार के लिए इसका उपयोग करने की अनुमति देता है। यह वास्तव में संगत है, लेकिन जावा के पास @SuppressWarning के बिना इसे समझाने की कोई शक्ति नहीं है। मुझे नहीं लगता कि यह एक गड़बड़ है। आपका कोड वह कोड नहीं है जो मैं चाहता हूं। निम्नलिखित कोड काम नहीं करता है: https://gist.github.com/d2d24794f61b5afb7d57 – v6ak

संबंधित मुद्दे