Java - 在静态函数中构造泛型类的多个对象

qiu*_*bit 2 java generics

我正在尝试实现定义对象顺序的泛型类.这是我的代码片段:

import java.util.ArrayList;

public class OrderedObject<T> implements Comparable<OrderedObject<T>> {

    private T object;
    private int orderId;

    public OrderedObject(T object, int orderId) {
        this.object = object;
        this.orderId = orderId;
    }

    public T getObject() {
        return object;
    }

    public static ArrayList<OrderedObject<T>> defineOrder(ArrayList<T> objects) {
        ArrayList<OrderedObject<T>> orderedObjects = new ArrayList<OrderedObject<T>>();
        for (int i = 0; i < objects.size(); i++) {
            T object = objects.get(i);
            OrderedObject<T> orderedObject = new OrderedObject<T>(object, i);
            orderedObjects.add(orderedObject);
        }
        return orderedObjects;
    }

    @Override
    public int compareTo(OrderedObject<T> o) {
        return orderId - o.orderId;
    }

}
Run Code Online (Sandbox Code Playgroud)

defineOrder()我试图一次初始化这个类的多个对象 - 我希望顺序由数组中的泛型对象的位置定义,这个静态函数将采用通用对象T数组,并返回OrderedObject<T>数组.不幸的是,我编写的代码将无法编译,它表示无法对静态字段T进行引用,因为T不是静态的.

为什么T不是静止的?还有,有办法解决这种情况吗?

rge*_*man 5

类上T定义的类型参数仅在非static上下文中的范围内.它不在范围内的static方法中.

但是,您始终可以为static方法本身声明另一个类型参数.请注意,这T与班级不同T.只要Tstatic方法内部的引用也相应地重命名,它可以在不影响任何内容的情况下重命名.

public static <T> ArrayList<OrderedObject<T>> defineOrder(ArrayList<T> objects) {
Run Code Online (Sandbox Code Playgroud)

JLS第8.1.2节规定:

在以下任何一项中引用泛型类C的类型参数是编译时错误:

  • 静态成员的声明的C(§8.3.1.1,§8.4.3.2,第8.5.1节).

  • 嵌套在C中的任何类型声明的静态成员的声明

  • C(第8.7节)的静态初始化程序,或

  • 嵌套在C中的任何类声明的静态初始化程序.

(强调我的)