“<T> T get()”是什么意思?(它有用吗?
这似乎是有效的 Java 语法:
<T> T get();
但这意味着什么呢?它有用吗?
对否决者的澄清
我理解在方法参数中使用时的含义,如下所示:T
T get(Class<T> clazz);
返回类型可从传入的类中推断出来。
但是,当你没有参数来说明T是什么类型时,它是什么类型?
这似乎是有效的 Java 语法:
<T> T get();
但这意味着什么呢?它有用吗?
对否决者的澄清
我理解在方法参数中使用时的含义,如下所示:T
T get(Class<T> clazz);
返回类型可从传入的类中推断出来。
但是,当你没有参数来说明T是什么类型时,它是什么类型?
它是要为其分配返回值的变量的类型。
例如,如果你有这样的方法:
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();
但这意味着什么呢?
这意味着该语言有一套旨在尽可能简单的规则,在这里它们以一种不太有用的方式组合在一起。
泛型方法具有类型参数。类型参数可以在返回类型、参数列表和方法主体中使用。它可以用于这些的任意组合,包括根本没有。
例如,这些签名可能都很有用:
<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 );
}
}