ParameterizedType.getRawType()返回jlrType,而不是Class <?>?

pho*_*ser 22 java reflection

ParameterizedType parameterized =
    (ParameterizedType) List.class.getMethod("iterator").getGenericReturnType();
Type raw = parameterized.getRawType();
Run Code Online (Sandbox Code Playgroud)

ParameterizedType#getRawType()返回a Type,而不是a Class<?>(虽然我java.lang.Class现在已经实现Type).有没有一个很好的理由为什么getRawType()不声明它的返回类型Class<?>?是否存在getRawType()可能不是结果的极端情况Class<?>

这已经足够让人感到挣扎j.l.r.Type; 这似乎是一个他们本可以为我们拯救一个沮丧的实例.

irr*_*ble 13

它必须返回一个Class对象,没有别的办法.

为什么?谁知道,也许是一些理想主义的偏见.如果它返回Class,它将是ClassType接口中唯一的外观.

真正的问题是混合ClassType.以前,所有类型都代表Class.它已经很乱了,但仍然可以容忍.种类不多.

使用新的泛型类型,他们应该设计一个更清晰,更符合规范的Type层次结构Class.相反,他们成立ClassType创造更多的混乱.整个层次结构都没有意义.任何对该主题不熟悉并且不了解历史的人都会被这种废话吓到.

我不会把设计保持在Type高标准.例如,ParameterizedType定义equals(),但不是hashCode().ParameterizedType在一个哈希映射中没有办法实现两个工作.而通配符也是一种类型?一定不行.

而这个方法的名称getRawType()只是愚蠢的.它与此无关raw type.它应该清楚地命名getClassOrInterface().会不会太冗长?getActualTypeArguments()那么看看.(是的,它会返回实际的论点!不是假的!)


And*_*ndy 5

我正在思考这个问题,我有一种预感。也许他们想为未来的疯狂留下可能性,如下所示:

public class Z<L extends List<?>> {
    L<Double> test;
}
Run Code Online (Sandbox Code Playgroud)

这不是合法的 Java 代码,但我认为它的含义很清楚;new Z<ArrayList<?>>().test将是 类型ArrayList<Double>

如果这是合法的,((ParameterizedType) test.getGenericType()).getRawType()将返回一个TypeVariable.