6 Stimmen

zwei Typparameter mit demselben Namen

Ich frage mich, warum die beiden Typ-Parameter (mit dem Namen "A") mit demselben Namen ("A") wie im folgenden Beispiel zulässig sind. Ich weiß, dass dies eine SCHLECHTE Benennung von Typparametern ist, tun Sie das nicht.

(Ich vermute, dass sie sich auf einer anderen Ebene befinden, z. B. auf Klassen- und Funktionsebene, und dass der Compiler eine Art von Namensmanipulation verwendet)

class  MyTest[A](){
    type MyType  = A

    def checkString[A](value:A, x:MyType):A = { 
       value match {
         case x:String => println("Value is a String")
         case _ => println("Value is not a String")
       }

       x match {
          case x:String => println("x is a String")
          case _ => println("x is not a String")
       }

       value
   }
}

Beispielhafte Ausgabe von 2.8.0

scala> val test = new MyTest[Int]
test: MyTest[Int] = MyTest@308ff65f

scala> test.checkString("String",1)
Value is a String
x is not a String
res7: java.lang.String = String

scala> test.checkString(1,1)
Value is not a String
x is not a String
res8: Int = 1

4voto

Brian Hsu Punkte 8711

I

F

F

class Test1 {
    def test[A] (x: A) = println(x)
}

A

class Test2[A] {
    def test (x: Int) = println(x)
}

S

scala> val test = new MyTest[Int]
test: MyTest[Int] = MyTest@308ff65f

T

scala> test.checkString("String",1)
Value is a String
x is not a String
res7: java.lang.String = String

注意してください:

I

scala> val t = new MyTest[Int]
t: MyTest[Int] = MyTest@cb800f

scala> t.checkString ("A", "B")
<console>:8: error: type mismatch;
 found   : java.lang.String("B")
 required: t.MyType
       t.checkString ("A", "B")

N

checkString ("String", 1)

w

checkString (value: A, x: Int)

S

scala> val test = new MyTest[Int]
test: MyTest[Int] = MyTest@5bda13

scala> test.checkString[String]("String", 1)
Value is a String
x is not a String
res1: String = String

scala> test.checkString[Int] (3, 4)
Value is not a String
x is not a String
res4: Int = 3

scala> test.checkString[Int] ("String", 4)
<console>:8: error: type mismatch;
 found   : java.lang.String("String")
 required: Int
       test.checkString[Int] ("String", 4)
                          ^

1voto

Nikolay Ivanov Punkte 8737

Nun, ich glaube, in Scala verwenden wir dieselbe Regel wie in Java, im Grunde suchen wir den kleinsten verfügbaren Bereich in Java:

class Foo<T>{
   T instance;

   void <T> T getInstance(){
       return instance
    }
}

führt zu einem Kompilierungsfehler, da der in der generischen Methode getInstance deklarierte Typ T nicht mit dem Parametertyp der Klasse Foo identisch ist. Im Falle von Scala glaube ich, dann schreiben Sie

def checkString[A]

Sie t

0voto

RameshVel Punkte 62428

Es hat nicht nur mit Scala zu tun. In den meisten Sprachen kann man das tun. Denn wie Sie sagten, sind die Variablen in verschiedenen Bereichen.

In c#

class test
{
      int i;
      void method(int i)
      {
          this.i = i;
      }
}

steht für den Selbsttyp. Ich bin nicht sicher, über die diese Funktionalität in Scala. Aber der Grund für Ihre Frage ist Bereichsebene.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X