Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型类与静态泛型方法_Java_Generics - Fatal编程技术网

Java 泛型类与静态泛型方法

Java 泛型类与静态泛型方法,java,generics,Java,Generics,我在写普通课 public class SomeClass<T> { public static <T extends Comparable<? super T>> T min(Collection<? extends T> c) { T min = c.iterator().next(); for (T element : c) if (element.compareTo(min)

我在写普通课

public class SomeClass<T> {

    public static <T extends Comparable<? super T>> T min(Collection<? extends T> c) {
        T min = c.iterator().next();
        for (T element : c)
            if (element.compareTo(min) < 0)
                min = element;
        return min;
    }

}

public class Main {

    public static void main(String[] args) {
        SomeClass<Integer>.min(Arrays.asList(1, 2, 3)); // compile-time error
        SomeClass.min(Arrays.asList(1, 2, 3)); // ok
    }

}
公共类SomeClass{

public static它是不同的,您不应该编写这样的代码,特别是因为可能会产生混淆。始终在类和类内的方法上使用不同的类型变量。

类声明

public class SomeClass<T> 
定义
泛型方法
。泛型方法是引入自己的类型参数的方法。这类似于声明泛型类型,但类型参数的范围仅限于声明它的方法

现在,如果要调用泛型方法
min
,则需要调用:

SomeClass.<Integer>min(Arrays.asList(1,2,3));
SomeClass.min(Arrays.asList(1,2,3));

T表示类型,您正在访问与T无关的静态方法

要么像这样使用

SomeClass<Integer> a = new SomeClass<Integer>();
a.min(Arrays.asList(1, 2, 3));

两个
T
s是不同的:第一个是类的参数(未使用),第二个是特定于方法的。由于方法是静态的,因此类参数不会影响它


当您编写
SomeClass.min(Arrays.asList(1,2,3))时;
,您会收到一个错误,因为向
SomeClass
添加一个参数是没有意义的,因为该类的对象没有实例化。
SomeClass
仅用于告诉编译器您想从该类调用一个静态方法。您可以使用
SomeClass.min(Arrays.asList(1,2,3))向该方法添加一个参数;
,但您不必这样做,因为编译器可以在此处推断类型。

因此,编译消息告诉您这是一个语法错误。语法无效的原因很容易理解。您正在尝试对类型调用方法。这意味着您正在调用静态方法。静态方法不在泛型类型参数的范围内。因此,不允许在左侧放置泛型类型参数


如果您想知道技术原因,那是因为您的方法调用表达式不是。最接近您的形式是
TypeName.NonWildTypeArguments标识符(ArgumentListopt)
。但是
TypeName
(已定义)必须是标识符或包限定标识符。它不允许使用括号。

在方法
min
中键入参数T仅在方法的主体中可见?第二个问题是什么:为什么
SomeClass.min(Arrays.asList(1,2,3));
无效?我只是试图调用静态方法min。括号应该放在点的另一侧:
SomeClass.min(Arrays.asList(1,2,3))
。在调用类的静态方法时,不能向类提供泛型参数。我已经意识到了这一点。我的第二个问题呢?为什么字符串SomeClass.min(Arrays.asList(1,2,3))出现编译时错误我认为这是真的,因为我试图调用泛型类的方法。是的,我想了解为什么我们的编译器不允许编写
SomeClass.min(Arrays.asList(1,2,3));
?@dmitri这是因为您将类型参数放在了
之前。这是错误的;因为您希望为方法而不是类提供参数。在指定类型时,例如在声明变量时,在类名之后提供类型参数。编译时错误是什么?@newacct错误说明是“
”;”除非是一句话
。谢谢你详尽的回答!
SomeClass<Integer> a = new SomeClass<Integer>();
a.min(Arrays.asList(1, 2, 3));
SomeClass.min(Arrays.asList(1, 2, 3));