鉴于此
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence,
Constable, ConstantDesc {
...
为什么字符串返回无效?
你误解了这是什么意思。您显然认为这意味着:“T 是可比较对象或其某些子类型的任何东西”。
这是不正确的。毕竟,这个概念是由...
Comparable<String>
本身来代表的。
不,你把这些东西读作“未知”:
public void <T extends Comparable<T>> T getValue() { ... }
的意思是:
“有一种 unknown 类型。调用者知道它是什么,但这段代码不知道也不可能弄清楚它。我们所知道的是,调用者选择了它,每个调用者都可以选择不同的类型,并且,无论如何既然做出了选择,它至少是
Comparable<T>
的一个子类型。”
您的代码必须有效,以便它对任何调用者可能做出的所有可能选择都有效。 这听起来不可能,事实上确实如此——除非你知道其中的窍门。也就是说,泛型
链接事物。返回您不知道的类型的技巧是从调用者那里获取它,而调用者确实知道。这是一个简单的例子:
public <T> T print(T in) {
System.out.println(in);
return in;
}
在这个例子中,同样的未知发生了:T 是一个未知类型;呼叫者知道这一点,而您不知道也不可能知道。尽管如此,这段代码对于调用者可以做出的每一个可能的选择
都是有效的,因为你返回的是你首先从调用者那里得到的东西。
如果你想编写一个返回 String 的方法,就写 public String getValue() {return "hola";}
Comparable<String> str = getValue();
这可行 - 但在这里有点无用(只需将其分配给类型为 String
的变量;所有 String
值也是
Comparable<String>
;任何需要
Comparable<String>
的方法都可以传递一个字符串,它会工作。
注意:在某些情况下,您编写的方法具有仅在一个地方使用的类型参数 - 返回类型,但是,这些方法总是属于以下类别之一:
他们不知道要返回什么,因为字面上总是以
return null;
null
同时代表每种类型,因此,即使我们不知道 T 是什么,也必然与 T 兼容。
他们四处走动,不知道该返回什么,而永远不会返回
while (true) ;
是一种方法。总是以 throw new SomeException();
结尾是另一回事。如果您从未真正返回值,那么您的方法返回未知类型的值是没有问题的,这是不可能的。
他们用丑陋的演员阵容破解它:
return (T) something;
ClassCastException
错误。坏主意 - 混乱的代码不好,混乱的错误更糟糕。