为什么返回类型为<T extends Comparable<T>> T的方法不能返回String?

问题描述 投票:0回答:1

鉴于此

    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence,
                   Constable, ConstantDesc {
    ...

为什么字符串返回无效?

enter image description here

java generics
1个回答
0
投票

你误解了这是什么意思。您显然认为这意味着:“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
     错误。坏主意 - 混乱的代码不好,混乱的错误更糟糕。
    
    
© www.soinside.com 2019 - 2024. All rights reserved.