在Java中,我想有如下的东西:

class Clazz<T> {
  static void doIt(T object) {
    // ...
  }
}

但是我知道

Cannot make a static reference to the non-static type T

除了基本用途之外,我不了解泛型,因此无法理解它。我在网上找不到很多关于这个主题的信息,这也无济于事。

有人能澄清一下这种使用是否可能,以类似的方式?还有,为什么我最初的尝试失败了?


当前回答

我认为这个语法还没有被提到(在你想要一个没有参数的方法的情况下):

class Clazz {
  static <T> T doIt() {
    // shake that booty
  }
}

还有呼唤:

String str = Clazz.<String>doIt();

希望这能帮助到一些人。

其他回答

我认为这个语法还没有被提到(在你想要一个没有参数的方法的情况下):

class Clazz {
  static <T> T doIt() {
    // shake that booty
  }
}

还有呼唤:

String str = Clazz.<String>doIt();

希望这能帮助到一些人。

以下内容会让你更接近目标

class Clazz
{
   public static <U extends Clazz> void doIt(U thing)
   {
   }
}

编辑:更新的例子与更多的细节

public abstract class Thingo 
{

    public static <U extends Thingo> void doIt(U p_thingo)
    {
        p_thingo.thing();
    }

    protected abstract void thing();

}

class SubThingoOne extends Thingo
{
    @Override
    protected void thing() 
    {
        System.out.println("SubThingoOne");
    }
}

class SubThingoTwo extends Thingo
{

    @Override
    protected void thing() 
    {
        System.out.println("SuThingoTwo");
    }

}

public class ThingoTest 
{

    @Test
    public void test() 
    {
        Thingo t1 = new SubThingoOne();
        Thingo t2 = new SubThingoTwo();

        Thingo.doIt(t1);
        Thingo.doIt(t2);

        // compile error -->  Thingo.doIt(new Object());
    }
}

直到实例化一个类型,Java才知道T是什么。

也许你可以通过调用Clazz<T>.doit(一些东西)来执行静态方法,但听起来你不能。

另一种处理方法是将类型参数放在方法本身中:

static <U> void doIt(U object)

这并不能让你对U有正确的限制,但总比没有好....

我也遇到了同样的问题。我通过下载Collections的源代码找到了答案。在Java框架中进行排序。我使用的答案是在方法中放入<T>泛型,而不是在类定义中。

所以这是可行的:

public class QuickSortArray  {
    public static <T extends Comparable> void quickSort(T[] array, int bottom, int top){
//do it
}

}

当然,在阅读了上面的答案之后,我意识到这将是一个不使用泛型类的可接受的替代方案:

public static void quickSort(Comparable[] array, int bottom, int top){
//do it
}

Also to put it in simple terms, it happens because of the "Erasure" property of the generics.Which means that although we define ArrayList<Integer> and ArrayList<String> , at the compile time it stays as two different concrete types but at the runtime the JVM erases generic types and creates only one ArrayList class instead of two classes. So when we define a static type method or anything for a generic, it is shared by all instances of that generic, in my example it is shared by both ArrayList<Integer> and ArrayList<String> .That's why you get the error.A Generic Type Parameter of a Class Is Not Allowed in a Static Context!