Java 接口前无接口字
这是细节,但我想知道为什么会发生这种情况 示例代码:Java 接口前无接口字,java,comparable,Java,Comparable,这是细节,但我想知道为什么会发生这种情况 示例代码: Class klasa = Enum.class; for(Type t : klasa.getGenericInterfaces()) System.out.println(t); 程序的输出: java.lang.Comparable<E> interface java.io.Serializable java.lang.com 接口java.io.Serializable 为什么在输出中,java.lang.Co
Class klasa = Enum.class;
for(Type t : klasa.getGenericInterfaces())
System.out.println(t);
程序的输出:
java.lang.Comparable<E>
interface java.io.Serializable
java.lang.com
接口java.io.Serializable
为什么在输出中,java.lang.Comparable
之前没有接口字。这是接口,是吗
我认为产出应该是:
**interface** java.lang.Comparable<E>
interface java.io.Serializable
**接口**java.lang.com
接口java.io.Serializable
Comparable是经过特殊处理的吗?发生的事情是,您得到了两个不同的子类
java.lang.reflect.Type
;一种是泛型类型(可能是j.l.r.parameteredType
),另一种是特定(非泛型)接口类型(aj.l.Class
)
您想对该信息做什么,以及为什么?表示“接口”在任何情况下都不会输出(内部类型
,即可比
):
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();
}
将对象转换为字符串。字符串表示法是字符串“类”或“接口”,后跟空格,然后是类的完全限定名,格式为getName。如果此类对象表示基元类型,则此方法返回基元类型的名称。如果该类对象表示void,则该方法返回“void”
公共字符串更多…toString(){
StringBuilder sb=新的StringBuilder();
if(ownerType!=null){
if(ownerType实例类)
sb.append(((类)ownerType.getName());
其他的
sb.append(ownerType.toString());
某人加上(“.”);
if(ownerType instanceof ParameterizedTypeImpl){
//通过删除
//与所有者共享前缀。
sb.append(rawType.getName().replace((ParameterizedTypeImpl)ownerType).rawType.getName()+“$”,
""));
}否则
sb.append(rawType.getName());
}否则
sb.append(rawType.getName());
if(actualTypeArguments!=null&&
actualTypeArguments.length>0){
某人加上(“”);
}
使某人返回字符串();
}
调用ParameterizedTypeImpl
的toString()方法后,不会附加接口关键字。它只调用getName()
方法
名称接口java.lang.Compariable
在t中。语句System.out.println(t)之后代码>调用toString()
当我调试时,您可以看到下图
我只想知道为什么缺少word界面
。这是接口
,但缺少接口
word。因为调用了两个不同版本的toString()
;添加接口的类版本,以及不添加接口的ParameterizedType
子类版本。不过,这是一个学术问题,还是您需要根据这些数据执行决策?这是我未来知识的学术问题。如果您可以访问OpenJDK源代码,请查看java.lang.Class#toString()
和sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl#toString()
。幸运猜测:java.lang包中有Compariable。
public String toString() {
return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
+ getName();
}
public String 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();
}