2017-07-13 27 views
3

問:爲什麼包含類的名稱會出現兩次?爲什麼外部類在泛型類型名稱中出現兩次?

語境:我生成代碼和目標是讓現場的聲明,如寫入源(完全合格是好的,但我需要的類型參數):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()); 
    } 
} 

輸出:

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

UPDATE: 謝謝大家對您的輸入。由於這個問題被標記爲重複,我張貼了我目前的工作解決方案over there

+2

另見https://bugs.openjdk.java.net/browse/JDK-8054213的。 – Radiodef

+0

@Radiodef好,這個問題似乎與我的問題相同。所以這是一個錯誤? (轉換爲答案) – Zalumon

+1

它可能應該被認爲是一個錯誤,但是對於類型的'String'表示沒有真正的標準化規範。 ['getTypeName'](http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Type.html#getTypeName--)沒有指定任何特定的要求,也沒有'toString '。這不是API非常發達的部分。 – Radiodef

回答

3

genericType是ParameterizedTypeImpl

了toString()方法返回ownerType類的名稱的實例,然後rawType類名。

的反編譯一塊代碼

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

感謝您的調查。我仍然想知道爲什麼它是這樣的。這有用嗎?我怎樣才能實現我的目標? – Zalumon

+1

他們試圖提供更多信息 - 您可以檢查並跳過'System.out.println(「原始類型泛型:」+((ParameterizedTypeImpl)genericType).getRawType());' – StanislavL

+0

ParameterizedTypeImpl是一個太陽類,我寧願不使用它。 – Zalumon

相關問題