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

时间:2015-05-14 22:14:39

标签: 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;
    }

}

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

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

3 个答案:

答案 0 :(得分:5)

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

但是,您始终可以为static方法本身声明另一个类型参数。请注意,此T与类T不同。只要对T方法中的static的引用也相应地重命名,就可以重命名它而不会影响任何内容。

public static <T> ArrayList<OrderedObject<T>> defineOrder(ArrayList<T> objects) {

Section 8.1.2 of the JLS州:

  

在以下任何一项中引用泛型类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) { 

然后它编译得很好