2016-04-03 114 views
1

运行Demo类将调用在SomeClass的一个静态方法的newInstance到调用构造和打印你好(泛型)不能使静态参考非静态类型T

限定的方法将包括一个返回类型+带参数

为的newInstance返回类型为<方法名T> SomeClass的< T>似乎不可思议我 因为我的类被称为>的SomeClass的< t键< T> SomeClass的< T>

为什么我需要在SomeClass < T>前面的< T>? 看来,如果我不包括它会有所谓不能使静态参考非静态类型T

另一件事指出一个常见的错误 的是,我可以把之间有很多的空间< T>和SomeClass < T>因此它看起来不像他们需要在一起。

public class SomeClass<T> { 

    public static <T>SomeClass<T> newInstance(Class<T> clazz){ 
     return new SomeClass<T>(clazz); 
    } 

    private SomeClass(Class<T> clazz){ 
     System.out.println("hello"); 
    } 
} 

public class Demo { 

    public static void main(String args[]) 
    { 
     SomeClass<String> instance = SomeClass.newInstance(String.class); 
    } 
} 
+0

根据带问号的唯一句子标记为重复。 –

+0

http://stackoverflow.com/questions/12108118/what-do-the-angle-brackets-mean-in-this-interface-definition –

回答

4

什么是静态方法?一种适用于该类的方法,而不是一个特定的实例。类签名public class SomeClass<T>中的通用参数T仅适用于特定实例(因此为non-static type T)。例如SomeClass<String>其中的[T = String]

在方法签名public static <T>SomeClass<T> newInstance(Class<T> clazz)中包含<T>。你是这么说的;对于此方法,有一个通用类型参数T。这个T与类签名中的T分开。所以它可能是C,即public static <C> SomeClass<C> newInstance(Class<C> clazz)。或者完全不同的东西。

但是,如果您没有在方法中包含<T>,编译器会认为您正尝试在类签名中使用T。这是违法的。