Probleme mit Generika habenJava

Java-Forum
Guest
 Probleme mit Generika haben

Post by Guest »

Entschuldigung für den schlechten Titel. Ich würde mich bei der Erstellung eines besseren Hilfe freuen, aber ich weiß nicht einmal, wie ich mein Problem beschreiben soll. Typen. < /p>

Code: Select all

interface M {}
interface F {}
< /code>
Und sagen wir, ich mache eine Klasse, die beide Schnittstellen implementiert. < /p>
record A (A1 a1, A2 a2)
implements
M,
F
{}
< /code>
Ok, cool. Ich kann jetzt ein 
überall verwenden, wo ich sonst m oder f .
Jetzt verwendet hätte. Jetzt ist hier mein Problem. Ich versuche Folgendes zu tun und fehlgeschlagen bei Compiler -Fehlern. < /P>

Code: Select all

public class DoublyNestedGenerics
{

interface M {}

interface F {}

record A  (A1 a1, A2 a2)
implements
M,
F
{}

private
static
<
D1,
D2,
D extends
M
& F
>
D
canItWork(final D1 d1, final D2 d2)
{

// return new A(d1, d2);
throw new UnsupportedOperationException();

}

}
< /code>
OK, also alles kompiliert. Aber wenn ich die Rückgabe erfasse und die Ausnahme ersetze, erhalte ich den folgenden Kompilierungsfehler. < /P>
DoublyNestedGenerics.java:28: warning: [rawtypes] found raw type: A
return new A(d1, d2);
^
missing type arguments for generic class A
where A1,A2 are type-variables:
A1 extends Object declared in record A
A2 extends Object declared in record A
< /code>
OK, macht Sinn. Lassen Sie mich stattdessen die Rückkehr ändern. < /P>
  return new A(d1, d2);
< /code>
Das Drücken von Kompilien gibt mir den folgenden Compiler -Fehler. < /p>
DoublyNestedGenerics.java:28: error: incompatible types: cannot infer type arguments for A
return new A(d1, d2);
^
reason: no instance(s) of type variable(s) A1,A2 exist so that A conforms to D
where A1,A2,D,D1,D2 are type-variables:
A1 extends Object declared in record A
A2 extends Object declared in record A
D extends M,F declared in method canItWork(D1,D2)
D1 extends Object declared in method canItWork(D1,D2)
D2 extends Object declared in method canItWork(D1,D2)
1 error
< /code>
Ich habe den Fehler nicht vollständig verstanden, daher habe ich beschlossen, das [url=viewtopic.php?t=11587]Problem[/url] zu vereinfachen. von nur D1 
und d2 . So sieht die neue Methode aus. < /P>

Code: Select all

   private
static
<
D extends
M
& F
>
D
canItWorkAttempt2(final Integer d1, final Integer d2)
{

// return new A(d1, d2);
throw new UnsupportedOperationException();

}
< /code>
tauscht die Kommentare aus und das Drücken von Compile gab mir den folgenden Compiler -Fehler. < /p>
DoublyNestedGenerics.java:44: error: incompatible types: cannot infer type arguments for A
return new A(d1, d2);
^
reason: no instance(s) of type variable(s) A1,A2 exist so that A conforms to D
where A1,A2,D are type-variables:
A1 extends Object declared in record A
A2 extends Object declared in record A
D extends M,F declared in method canItWorkAttempt2(Integer,Integer)
1 error
< /code>
OK, viel kleiner und daher leichter analysieren. < /p>
Eine Sache, die mir aufgefallen ist Notieren Sie a 
. Vielleicht braucht die Inferenz Hilfe. Also habe ich stattdessen die Rückkehr geändert. < /P>

Code: Select all

  return new A(d1, d2);
< /code>
Dies führte zu dem folgenden Kompiliererfehler.  < /p>
DoublyNestedGenerics.java:44: error: incompatible types: A cannot be converted to D
return new A(d1, d2);
^
where D is a type-variable:
D extends M,F declared in method canItWorkAttempt2(Integer,Integer)
1 error
< /code>
Fortschritt! Ich fing jetzt an, Verdacht zu haben, und um sie zu bestätigen, beschloss ich, mein [url=viewtopic.php?t=11587]Problem[/url] erheblich zu vereinfachen. Ich habe die folgende Klasse erstellt. < /P>
record N (Integer n1, Integer n2)
implements
M,
F
{}
< /code>
Kompiliert ohne Probleme. Schön, versuchen wir, den Rückgabetyp zu ändern, um dies stattdessen zu verwenden. Hier ist, was ich die Rückkehr geändert habe. < /P>
return new N(d1, d2);
< /code>
Mit hohen Hoffnungen drückte ich Compile. < /p>
DoublyNestedGenerics.java:50: error: incompatible types: N cannot be converted to D
return new N(d1, d2);
^
where D is a type-variable:
D extends M,F declared in method canItWorkAttempt2(Integer,Integer)
1 error
< /code>
Sehr enttäuschend. Aber für mich tauchte etwas anderes auf. In dem Fehler heißt es, wo D d ein Typ-Variable ist: D erweitert M , F  
.
Sie verwendeten das Wort < em> erweitert . Aus Verzweiflung habe ich versucht, die folgenden Typen hinzuzufügen. < /P>

Code: Select all

interface C extends M, F {}

record N2 (Integer n1, Integer n2) implements C {}
< /code>
und dann habe ich von dort aus meine Rückkehr geändert, um dies zu sagen. < /p>
final C blah = new N2(d1, d2);
return blah;
< /code>
Dann habe ich Compile gedrückt. < /p>
DoublyNestedGenerics.java:55: error: incompatible types: C cannot be converted to D
return blah;
^
where D is a type-variable:
D extends M,F declared in method canItWorkAttempt2(Integer,Integer)
1 error
< /code>
Zu diesem Zeitpunkt bin ich verärgert. /Code>. Und es wird mir auch gesagt, dass D ein Typ-Variable 
ist, insbesondere, dass D M , F genau das ist, was genau das ist C. Macht . Und doch funktioniert es immer noch nicht? < /P>
Was bringt mich hierher. Was vermisse ich? Und wieder möchte, dass ein besserer Titel geschaffen wird, wenn jemand bereit ist, Vorschläge zu machen. /p>

Code: Select all

public class DoublyNestedGenerics
{

interface M {}

interface F {}

record A  (A1 a1, A2 a2)
implements
M,
F
{}

record N (Integer n1, Integer n2)
implements
M,
F
{}

interface C extends M, F {}

record N2 (Integer n1, Integer n2) implements C {}

private
static
<
D1,
D2,
D extends
M
& F
>
D
canItWork(final D1 d1, final D2 d2)
{

// return new A(d1, d2);
throw new UnsupportedOperationException();

}

private
static
<
D extends
M
& F
>
D
canItWorkAttempt2(final Integer d1, final Integer d2)
{

final C blah = new N2(d1, d2);
return blah;
// return new N(d1, d2);
// throw new UnsupportedOperationException();

}

}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post