关于泛型以及它们在这个问题背后真正做了什么有一个很好的讨论,所以我们都知道Vector<int[]>是一个整数数组的向量,HashTable<String, Person>是一个键是字符串和值Person的表。 然而,令我困惑的是Class<>的用法。

java类class也应该有一个模板名(或者是eclipse中的黄色下划线告诉我的)。我不知道我应该在里面写什么。Class对象的全部意义是当您没有关于对象的全部信息时,用于反射等。为什么它让我指定哪个类的类对象将持有?我显然不知道,否则我不会使用Class对象,我会使用特定的对象。


当前回答

在@ kiire Haglin的回答之后,可以在JAXB解组的文档中看到泛型方法的进一步示例:

public <T> T unmarshal( Class<T> docClass, InputStream inputStream )
         throws JAXBException {
  String packageName = docClass.getPackage().getName();
  JAXBContext jc = JAXBContext.newInstance( packageName );
  Unmarshaller u = jc.createUnmarshaller();
  JAXBElement<T> doc = (JAXBElement<T>)u.unmarshal( inputStream );
  return doc.getValue();
}

这允许解组返回任意JAXB内容树类型的文档。

其他回答

再举一个例子,Class的泛型版本(Class<T>)允许编写如下所示的泛型函数。

public static <T extends Enum<T>>Optional<T> optionalFromString(
        @NotNull Class<T> clazz,
        String name
) {
    return Optional<T> opt = Optional.ofNullable(name)
            .map(String::trim)
            .filter(StringUtils::isNotBlank)
            .map(String::toUpperCase)
            .flatMap(n -> {
                try {
                    return Optional.of(Enum.valueOf(clazz, n));
                } catch (Exception e) {
                    return Optional.empty();
                }
            });
}

在java <T中>表示泛型类。泛型类可以处理任何类型的数据类型,换句话说,它是独立于数据类型的。

public class Shape<T> {
    // T stands for "Type"
    private T t;

    public void set(T t) { this.t = t; }
    public T get() { return t; }
}

T表示类型。现在,当你创建这个Shape类的实例时,你需要告诉编译器它将处理什么数据类型。

例子:

Shape<Integer> s1 = new Shape();
Shape<String> s2 = new Shape();

Integer是一个类型,String也是一个类型。

<T>特别代表泛型类型。根据Java文档-泛型类型是通过类型参数化的泛型类或接口。

您经常希望在Class中使用通配符。例如,类<?扩展JComponent>,将允许您指定该类是JComponent的某个子类。如果您已经从Class中检索了Class实例。forName,则可以使用Class。例如,在尝试构造实例之前,使用as子类进行强制转换。

一开始会让人困惑。但它在以下情况下会有所帮助:

class SomeAction implements Action {
}

// Later in the code.
Class<Action> actionClass = Class.forName("SomeAction"); 
Action action = actionClass.newInstance();
// Notice you get an Action instance, there was no need to cast.

使用类的泛化版本class允许您编写类似于

Class<? extends Collection> someCollectionClass = someMethod();

然后你可以确定你接收到的Class对象扩展了Collection,并且这个类的实例(至少)是一个Collection。