这似乎是有效的Java语法:“<T> T get()”是什么意思? (而且是它有用吗?)
<T> T get();
但是这是什么意思?它有用吗?
澄清征求DOWNVOTERS
我明白当T
的方法参数使用,这样就意味着:
T get(Class<T> clazz);
的返回类型是那类inferrable通过英寸
但是,当你没有参数来说什么类型T是什么类型是它?
这似乎是有效的Java语法:“<T> T get()”是什么意思? (而且是它有用吗?)
<T> T get();
但是这是什么意思?它有用吗?
澄清征求DOWNVOTERS
我明白当T
的方法参数使用,这样就意味着:
T get(Class<T> clazz);
的返回类型是那类inferrable通过英寸
但是,当你没有参数来说什么类型T是什么类型是它?
但是这是什么意思?
这意味着该语言有一套旨在尽可能简单的规则,并且在这里它们的组合方式不是非常有用。
一般方法有类型参数。类型参数可用于返回类型中的参数列表中的方法主体中。它可以用于任何组合,包括任何组合。
例如,这些签名可以都是有用:
<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,要么成为。
下面是一个例子hack。我不认为它有用,因为有一个更简单的方法来实现这一点。 也许如果您从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);
}
}
这意味着一切都真的。下面的代码将用警告和barf进行编译。如果没有在某个时刻声明/推断类型是什么,那么键入方法没有什么好的理由。
public class GenericExample {
public static void main(String[] args) {
String eejits = get();
System.out.println(eejits);
Integer knobends = get(); // Throws a ClassCastException.
}
private static <T> T get() {
return (T) "I love to downvote without explaining why";
}
}
更加明确,它没有比这样更好的(也许除了你只有在一个地方投)
public class GenericExample {
public static void main(String[] args) {
String s = (String) get();
System.out.println(s);
Integer i = (Integer) get();
}
private static Object get() {
return "I really hope the caller expects a String, cos otherwise I'm going to downvote them";
}
}
这是变量的要指定该报税表的类型价值。
例如 如果你有这样一个方法:
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();
嗯,我不认为你可以'String s = getGenericNumber()',如果你明确地将它绑定到'extends Number'。但我明白你的观点。 –
是的,你是对的 - 在这种情况下,你可以分配给数字 - 我会改变它 –
这是返回'T'类型值的泛型方法。方法签名前面的''表明'T'是该方法的一个类型参数,而不是拥有它的类。 –
dasblinkenlight
无论调用者要求什么,这意味着它或者a)总是抛出,b)总是返回null,c)这是一个邪恶的黑客。 –
@Louis Wasserman因此,本质上它留给调用者来决定类型,即它基本上是类型不安全的。那是对的吗?它有用吗? –