“<T> T get()”是什么意思?(它有用吗?

2022-09-04 22:31:28

这似乎是有效的 Java 语法:

<T> T get();

但这意味着什么呢?它有用吗?


对否决者的澄清

我理解在方法参数中使用时的含义,如下所示:T

T get(Class<T> clazz);

返回类型可从传入的类中推断出来。

但是,当你没有参数来说明T是什么类型时,它是什么类型?


答案 1

它是要为其分配返回值的变量的类型。

例如,如果你有这样的方法:

public static <T> T getGenericNumber() {
    // the number-generator might return int, double, float etc. values
    return (T) numberGenerator.getANumber();
}

例如,您可以将方法的返回值直接赋给双精度值 - 无需强制转换:

Double a = getGenericNumber();

因此,您基本上已将强制转换从变量的声明移动到方法中。

这是潜在的危险,因为你可以很容易地产生强制转换异常,因为你可以做这样的事情 - 并且仍然能够编译:

String s = getGenericNumber();

答案 2

但这意味着什么呢?

这意味着该语言有一套旨在尽可能简单的规则,在这里它们以一种不太有用的方式组合在一起。

泛型方法具有类型参数。类型参数可以在返回类型、参数列表和方法主体中使用。它可以用于这些的任意组合,包括根本没有。

例如,这些签名可能都很有用:

<T> T foo( T t )  // The return type can be the type parameter
<T> List<T> ( )   // A type parameter does not have to be an argument

使用相同的规则,组合方式不同。<T> T get()

它有用吗?

不是特别的。您尚未显示实现。@LouisWasserman在一篇有见地的评论中指出,一个实现要么必须抛出,要么返回null,要么就是一个黑客

下面是一个示例黑客。我不认为它有用,因为有一种更简单的方法可以做到这一点。如果您要从C转换为Java,并希望代码尽可能保持并行,那么它可能会很有用。

public static class Union {
    public Object o;
    public Union( Object value ) { o = value; }
    public Class<? extends Object> getType() { return o.getClass(); }
    public <T> T value() {
        return (T) o;   // <-- uses type parameter to cast
    }
}

public static void main(String[] args) {
    Union union = new Union( "foo" );

    Class<?> valueType = union.getType();
    if ( valueType.equals( String.class )) {
        String s = union.value();     // <-- the call 
        System.out.println( s );
    }
}

推荐