7

这是细节,但我想知道为什么会这样。

示例代码:

Class klasa = Enum.class;
for(Type t : klasa.getGenericInterfaces())
   System.out.println(t);

程序的输出:

java.lang.Comparable<E>
interface java.io.Serializable

为什么输出之前没有接口字java.lang.Comparable<E>。是界面吧?

在我看来,输出应该是:

**interface** java.lang.Comparable<E>
interface java.io.Serializable

比得上是特殊待遇?

4

3 回答 3

3

(internal of )的toString方法ParametrizedTypeImpl,表示无论如何都不输出“接口”:TypeComparable

public String toString() {
    StringBuilder sb = new StringBuilder();

    if (ownerType != null) {
        if (ownerType instanceof Class)
            sb.append(((Class)ownerType).getName());
        else
            sb.append(ownerType.toString());

        sb.append(".");

        if (ownerType instanceof ParameterizedTypeImpl) {
            // Find simple name of nested type by removing the
            // shared prefix with owner.
            sb.append(rawType.getName().replace( ((ParameterizedTypeImpl)ownerType).rawType.getName() + "$",
                                     ""));
        } else
            sb.append(rawType.getName());
    } else
        sb.append(rawType.getName());

    if (actualTypeArguments != null &&
        actualTypeArguments.length > 0) {
        sb.append("<");
        boolean first = true;
        for(Type t: actualTypeArguments) {
            if (!first)
                sb.append(", ");
            if (t instanceof Class)
                sb.append(((Class)t).getName());
            else
                sb.append(t.toString());
            first = false;
        }
        sb.append(">");
    }

    return sb.toString();
}

另一方面,在 的toString方法中,如果类是接口,则清楚地输出“接口”。Class

public String toString() {
    return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
        + getName();
}
于 2013-10-09T09:28:07.893 回答
1

发生的事情是你得到了两个不同的子类java.lang.reflect.Type; 一个是泛型​​类型(可能j.l.r.ParameterizedType),一个是特定(非泛型)接口类型(a j.l.Class<?>)。

你想用这些信息做什么,为什么?

于 2013-10-09T09:10:04.827 回答
1

java.lang.Class#toString

public String toString()

将对象转换为字符串。字符串表示是字符串“类”或“接口”,后跟一个空格,然后是由 getName 返回的格式的类的完全限定名称。如果此 Class 对象表示原始类型,则此方法返回原始类型的名称。如果此 Class 对象表示 void,则此方法返回“void”。

sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl#toString()

public String More ...toString() {
    StringBuilder sb = new StringBuilder();

    if (ownerType != null) {
        if (ownerType instanceof Class)
            sb.append(((Class)ownerType).getName());
        else
            sb.append(ownerType.toString());

        sb.append(".");

        if (ownerType instanceof ParameterizedTypeImpl) {
            // Find simple name of nested type by removing the
           // shared prefix with owner.
            sb.append(rawType.getName().replace( ((ParameterizedTypeImpl)ownerType).rawType.getName() + "$",
                                     ""));
        } else
            sb.append(rawType.getName());
    } else
        sb.append(rawType.getName());

    if (actualTypeArguments != null &&
        actualTypeArguments.length > 0) {
        sb.append("<");
        boolean first = true;
        for(Type t: actualTypeArguments) {
            if (!first)
                sb.append(", ");
            if (t instanceof Class)
                sb.append(((Class)t).getName());
            else
               sb.append(t.toString());
           first = false;
        }
        sb.append(">");
    }

    return sb.toString();
}  

调用toString()方法后ParameterizedTypeImpl不附加接口关键字。它只是调用getName()方法。

名称interface java.lang.Comparable在 t 中。语句System.out.println(t);调用后toString()
当我调试时,您可以看到下图

在此处输入图像描述

于 2013-10-09T09:45:21.603 回答