Java 与类的静态成员上的泛型混淆

Java 与类的静态成员上的泛型混淆,java,generics,Java,Generics,下面的代码让我很困惑 public class Test<T> { public static <T> Test<T> ok(T result) { .. 但是为什么在测试之前有额外的返回类型我不明白。这个例子实际上相当于 public class Test<T> { public static <U> Test<U> ok(U result) { .. 公共类测试{ 公共静态测试正常(U结果){ ..

下面的代码让我很困惑

public class Test<T> {
  public static <T> Test<T> ok(T result) {
  ..

但是为什么在测试之前有额外的返回类型我不明白。

这个例子实际上相当于

public class Test<T> {
  public static <U> Test<U> ok(U result) {
  ..
公共类测试{
公共静态测试正常(U结果){
..

另一个
引用了一个仅适用于该方法的不同泛型类型。为了避免混淆,最好对不同的事物使用不同的名称。

该示例实际上相当于

public class Test<T> {
  public static <U> Test<U> ok(U result) {
  ..
公共类测试{
公共静态测试正常(U结果){
..
另一个
是指仅适用于该方法的不同泛型类型。为避免混淆,最好对不同的对象使用不同的名称。

它是一个静态方法,因此不受实例的泛型类型参数的影响

如果希望
ok
方法受泛型参数的约束,则必须将
TestFactory
类作为只进行
T
类型测试的工厂,如下所示:

public class TestFactory<T> {
    public Test<T> ok(T result) {
        // ...
    }
}
公共类测试工厂{
公共测试正常(T结果){
// ...
}
}
因此在本例中,
TestFactory
只允许
String
结果,其他任何内容都是编译器错误

如果您更喜欢静态方法,您应该按照@jurez发布的方法来避免混淆:问题是,此静态方法的类型参数仅取决于给定输入参数的类型。

它是一个静态方法,因此不受实例的泛型类型参数的影响

如果希望
ok
方法受泛型参数的约束,则必须将
TestFactory
类作为只进行
T
类型测试的工厂,如下所示:

public class TestFactory<T> {
    public Test<T> ok(T result) {
        // ...
    }
}
公共类测试工厂{
公共测试正常(T结果){
// ...
}
}
因此在本例中,
TestFactory
只允许
String
结果,其他任何内容都是编译器错误


如果您更喜欢静态方法,您应该按照@jurez发布的方法来避免混淆:问题是,这个静态方法的type参数只取决于给定输入参数的类型。

那么它是返回测试还是有“两个”返回类型..如果它返回Test为什么它前面有额外的。如果它返回just T为什么它不是just T with and with TestIt's,因为编译器现在知道它有一个泛型类型。其他的Ts只是用来填充普通形式。关键是
ok
前面的
与中的不同类声明(
class Test
)。您有两个完全不同的类型参数,尽管它们的名称相同。类声明中的一个仅在实例方法中可用,而
ok
上的一个仅在那里可用。(
T result
使用为
ok
声明的类型参数,而不是
Test
).那么它是返回测试还是有“两个”返回类型..如果它返回Test为什么它前面有额外的。如果它返回just T为什么它不是just T with and with TestIt's,因为编译器现在知道它有一个泛型类型。其他的Ts只是用来填充普通形式。关键是
ok
前面的
与中的不同类声明(
class Test
)。您有两个完全不同的类型参数,尽管它们的名称相同。类声明中的一个仅在实例方法中可用,而
ok
上的一个仅在那里可用。(
T result
使用为
ok
声明的类型参数,而不是
Test
)。如果它返回U为什么该方法不只是公共静态ok(U结果);或公共静态U ok(U结果);(我想第一个选项更有意义,因为括号可能会突出显示它作为ok方法的参数与U相关,但无论如何,如果它返回U,为什么还会有测试呢?第一个
引入了一个新的泛型类型变量,与
无关。从编译器的角度来看,您有两个,并且可以使用其中一个。)<方法中的code>或
。如果您只想要一个,请忽略多余的
,并从类级别使用
。@jurez可能您在这里犯了一个错误:在静态方法中,您不能从实例中使用泛型,因为没有实例存在。@jurez嗯,可能我不够清楚,而您显然没有et我想说的。提供给泛型参数的具体类型是与实例关联的类型。你错的地方是,你告诉OP他可以在静态方法中使用
T
,这是错误的,因为在静态方法中它不可见。@Vlasec感谢澄清,你是正确的。你不能使用类型参数decla在静态方法的类级别上为红色,您只能在实例方法上使用它。因此
静态测试(T ok)
将不会编译。如果它返回U,则说明该方法不仅仅是公共静态ok(U result);或公共静态U ok(U result);(我想第一个选项更有意义,因为括号可能会突出显示它作为ok方法的参数与U相关,但无论如何,如果它返回U,为什么还会有测试呢?第一个
引入了一个新的泛型类型变量,与
无关。从编译器的角度来看,您有两个,并且可以使用其中一个。)<方法中的code>或
。如果您只想要一个,请忽略多余的
,并从类级别使用
。@jurez可能您在这里犯了一个错误:在静态方法中,您不能从实例中使用泛型,因为没有实例存在。@jurez嗯,可能我不够清楚,而您显然没有et我想说的。提供给泛型参数的具体类型是与实例关联的类型。你错的地方是,你告诉OP他可以使用
T
i