代码之家  ›  专栏  ›  技术社区  ›  Juan Marchionatto

为什么不能从返回类型为<t的方法返回String扩展了Comparable<t>>t?

  •  0
  • Juan Marchionatto  · 技术社区  · 1 年前

    鉴于此

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

    为什么String返回无效?

    enter image description here

    1 回复  |  直到 1 年前
        1
  •  3
  •   rzwitserloot    1 年前

    你误解了这意味着什么。你显然认为它的意思是:“T是任何可比的东西或它的某种亚型”。

    这是不正确的。毕竟,这个概念是用…来表示的。。。 Comparable<String> 它本身

    不,你把这些东西读成“未知”:

    public void <T extends Comparable<T>> T getValue() { ... }

    方法

    “有一个 未知的 类型调用者知道它是什么,但这段代码不知道,也不可能弄清楚。我们所知道的是,调用者选择了它,每个调用者都可以选择不同的,而且,无论做出什么选择,它至少是的一个子类型 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 ; 全部的 一串 值也是 可比较<字符串> ; 任何需要的方法 可比较<字符串> 可以传递一个字符串,它就会工作。

    注意:在某些情况下,您编写的方法具有仅在一个位置使用的类型param,即返回类型,然而,这些方法 总是 属于以下类别之一:

    • 他们四处走动,不知道该回报什么,总是以 return null; 因为 null 同时是每一种类型,因此,即使我们不知道T是什么,也必须与T兼容。
    • 他们四处走动,不知道用什么返回 再也回不来了 . while (true) ; 是一种方法。总是以结尾 throw new SomeException(); 是另一个。如果您从未实际返回值,那么您的方法应该返回未知类型的值是没有问题的,这是不可能的。
    • 他们用丑陋的演员阵容破解了它: return (T) something; 。这会生成一个警告,因为编译器具有 不知道 .只要你说话,事情就会解决的。如果他们不这样做,为什么要这样做,你最终会 ClassCastException 没有强制转换的行上的错误。坏主意——混淆代码是坏主意,混淆错误更糟糕。