在Java中,我想有如下的东西:
class Clazz<T> {
static void doIt(T object) {
// ...
}
}
但是我知道
Cannot make a static reference to the non-static type T
除了基本用途之外,我不了解泛型,因此无法理解它。我在网上找不到很多关于这个主题的信息,这也无济于事。
有人能澄清一下这种使用是否可能,以类似的方式?还有,为什么我最初的尝试失败了?
在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();
希望这能帮助到一些人。
其他回答
当您为类指定泛型类型时,JVM只知道它是类的实例,而不是定义。每个定义只有参数化类型。
泛型的工作方式类似于c++中的模板,因此您应该首先实例化类,然后使用指定类型的函数。
我也遇到了同样的问题。我通过下载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!
在声明doIt()方法时,可以使用泛型方法的语法来做你想做的事情(注意doIt()方法签名中的static和void之间添加了<T>):
class Clazz<T> {
static <T> void doIt(T object) {
// shake that booty
}
}
我让Eclipse编辑器接受上面的代码,没有Cannot make a static reference to the non-static type T错误,然后将其扩展到以下工作程序(完成一些适合年龄的文化引用):
public class Clazz<T> {
static <T> void doIt(T object) {
System.out.println("shake that booty '" + object.getClass().toString()
+ "' !!!");
}
private static class KC {
}
private static class SunshineBand {
}
public static void main(String args[]) {
KC kc = new KC();
SunshineBand sunshineBand = new SunshineBand();
Clazz.doIt(kc);
Clazz.doIt(sunshineBand);
}
}
当我运行它时,它将这些行打印到控制台:
抖抖那个“战利品”类com.eclipseoptions.datamanager。Clazz KC美元”! ! 抖抖那个“战利品”类com.eclipseoptions.datamanager。Clazz SunshineBand美元”! !
不能在静态方法或静态字段中使用类的泛型类型参数。类的类型参数只在实例方法和实例字段的范围内。对于静态字段和静态方法,它们在类的所有实例之间共享,甚至是不同类型参数的实例,因此显然它们不能依赖于特定的类型参数。
您的问题似乎不需要使用类的类型参数。如果你能更详细地描述你想要做的事情,也许我们可以帮助你找到更好的方法。