我正在尝试实现定义对象顺序的泛型类。这是我的代码片段:
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;
}
}
in defineOrder()
我试图一次初始化这个类的多个对象 - 我希望顺序由数组中通用对象的位置定义,这个静态函数将采用通用对象{{1数组,并返回T
数组。不幸的是,我编写的代码将无法编译,它表示无法对静态字段T进行引用,因为T不是静态的。
为什么T不是静止的?还有,有办法解决这种情况吗?
答案 0 :(得分:5)
类上定义的类型参数T
仅在非static
上下文中的范围内。它不在static
方法范围内。
但是,您始终可以为static
方法本身声明另一个类型参数。请注意,此T
与类T
不同。只要对T
方法中的static
的引用也相应地重命名,就可以重命名它而不会影响任何内容。
public static <T> ArrayList<OrderedObject<T>> defineOrder(ArrayList<T> objects) {
在以下任何一项中引用泛型类C的类型参数是编译时错误:
C的静态成员的声明(§8.3.1.1,§8.4.3.2,§8.5.1)。
声明嵌套在C中的任何类型声明的静态成员。
C(第8.7节)的静态初始值设定项,或
嵌套在C中的任何类声明的静态初始值设定项。
(强调我的)
答案 1 :(得分:3)
您不能在静态上下文中使用T
的原因是T
是由此类的实例化定义的。因此,当您无法创建此类的实例时(即,使用静态方法时),将不会定义T
。我建议您定义一个新的泛型(可能是K
),仅在此静态方法的上下文中使用。
您的新方法签名可能如下所示:
public static <K> ArrayList<OrderedObject<K>> defineOrder(ArrayList<K> objects)
答案 2 :(得分:0)
我没有看到使其静止的解决方案。如果删除函数中的静态引用,则;
public ArrayList<OrderedObject<T>> defineOrder(ArrayList<T> objects) {
然后它编译得很好