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

toStringメソッドParametrizedTypeImpl(の内部)TypeComparable、「interface」がどのような場合でも出力されないことを示します。

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.Class#toString

public String toString()

オブジェクトを文字列に変換します。文字列表現は、文字列「class」または「interface」の後にスペースが続き、その後に 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()メソッドの呼び出し後、 ParameterizedTypeImplinterface キーワードを追加しません。getName()メソッドを呼び出すだけです。

名前interface java.lang.Comparableは t にあります。ステートメントSystem.out.println(t);呼び出しの後toString()
デバッグすると、下の画像が表示されます

ここに画像の説明を入力

于 2013-10-09T09:45:21.603 に答える
1

の 2 つの異なるサブクラスを取得することになりますjava.lang.reflect.Type。1 つはジェネリック型 (おそらくj.l.r.ParameterizedType) で、もう 1 つは特定の (非ジェネリック) インターフェイス型 (a j.l.Class<?>) です。

その情報で何をしたいですか、またその理由は何ですか?

于 2013-10-09T09:10:04.827 に答える