2017-07-13 2 views
3

F: Warum erscheint der Name der enthaltenden Klasse zweimal?Warum erscheint die äußere Klasse zweimal im generischen Typnamen?

Kontext: Ich Generieren von Code und das Ziel ist die Deklaration des Feldes zu erhalten, wie es in der Quelle geschrieben (Fully Qualified ist in Ordnung, aber ich brauche die Typ-Parameter): test.Foo.Bar<java.lang.String>

package test; 

import java.lang.reflect.Field; 
import java.lang.reflect.Type; 

public class Foo 
{ 
    public static class Bar<TYPE> {} 

    private Bar<String> bar; 

    public static void main(String[] args) throws Exception 
    { 
    Field field = Foo.class.getDeclaredField("bar"); 
    Type genericType = field.getGenericType(); 
    Type type = field.getType(); 

    System.out.println("genericType: " + genericType.getTypeName()); 
    System.out.println("  type: " + type.getTypeName()); 
    } 
} 

Ausgang:

genericType: test.Foo.test.Foo$Bar<java.lang.String> 
     type: test.Foo$Bar 

UPDATE: Vielen Dank an alle für Ihre Eingabe. Da diese Frage als doppelt markiert wurde, habe ich meine aktuelle Arbeitslösung over there gepostet.

+2

Auch https://bugs.openjdk.java.net/browse/JDK-8054213 sehen. – Radiodef

+0

@Radiodef guten Fang, dieses Problem scheint mit meiner Frage identisch zu sein. Also ist es ein Fehler? (konvertieren zu antworten) – Zalumon

+1

Es sollte wahrscheinlich als ein Fehler betrachtet werden, aber es gibt nicht wirklich eine standardisierte Spezifikation für 'String' Repräsentationen von Typen. ['getTypeName'] (http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Type.html#getTypeName--) spezifiziert keine besonderen Anforderungen und auch keine toString '. Es ist kein sehr gut entwickelter Teil der API. – Radiodef

Antwort

3

genericType ist Instanz ParameterizedTypeImpl

die toString() Methode gibt Ownertype Klasse Name und dann rawType Klassennamen.

Das dekompilierten Stück des Codes

public String toString() { 
    StringBuilder var1 = new StringBuilder(); 
    if(this.ownerType != null) { 
     if(this.ownerType instanceof Class) { 
      var1.append(((Class)this.ownerType).getName()); //<--- 
     } else { 
      var1.append(this.ownerType.toString()); 
     } 

     var1.append("."); 
     if(this.ownerType instanceof ParameterizedTypeImpl) { 
      var1.append(this.rawType.getName().replace(((ParameterizedTypeImpl)this.ownerType).rawType.getName() + "$", "")); 
     } else { 
      var1.append(this.rawType.getName()); //<------------ 
     } 
+1

Danke für die Untersuchung. Ich frage mich immer noch, warum es so ist. Wie ist das nützlich? Wie kann ich mein Ziel erreichen? – Zalumon

+1

Sie versuchen, weitere Informationen bereitzustellen - für Ihre Frage können Sie überprüfen und überspringen 'System.out.println (" Raw-Typ von generischen: "+ ((ParameterizedTypeImpl) genericType) .getRawType());' – StanislavL

+0

ParameterizedTypeImpl ist eine Sonnenklasse Ich würde es lieber nicht benutzen. – Zalumon

Verwandte Themen