【问题标题】:Generics methods in JavaJava中的泛型方法
【发布时间】:2012-11-08 09:45:03
【问题描述】:

我的问题是:是否可以制作一种通用方法来使用两种不同的类型?例如。一个整数和一个字符串。

这没有实际用途,但我想知道它是否可能。如果是,如何? :)

【问题讨论】:

  • 泛型类型会影响方法的哪一部分(参数、返回值、其他)?
  • 你的意思是像V put(K key, V value) in java.util.Map
  • 是的,有可能。看看java.util.Map
  • 有几种方法可以做到这一点。哪个最合适取决于上下文。
  • 你的意思是你想要一个像<T> foo(T t)这样的方法,其中T可以是String也可以是Integer?

标签: java generics methods


【解决方案1】:

您不需要为此使用泛型。您可以重载方法。例如

public void method(Integer i){}

public void method(String s){}

如果您使用整数调用方法,那么它将调用第一个方法。如果你用字符串调用它,它会调用第二种方法。

【讨论】:

  • @brimborium,我不认为它错过了重点。它可以解决问题。对于那些特定类型。我认为这个观点很好。
  • @Vash OP 表示他认为这没有实际用途。他只是想知道是否可以使用泛型。
  • @brimborium 没有(实用或有用的)方法可以用泛型做到这一点。使用重载方法是最好的方法(IMO)来做这样的事情。 OP 或任何寻找答案的人可能不知道这一点,所以值得指出,所以我想说这个答案非常有针对性!
  • @GiovanniBotta 好的,所以答案应该是:“不,但这是一种不同的方法:[...]”。如果有人问你如何徒手捕鱼,你不会向他解释如何用鱼竿来做。至少在告诉他如何徒手完成以及为什么这是一种糟糕/无效/昂贵/耗时/随便/次优的方法之前。
【解决方案2】:

大概你的意思是两种不同类型的参数?

您可以对 String 参数使用一种方法,而另一种方法则将整数传递给 String 版本。

【讨论】:

    【解决方案3】:

    示例类型并不好,因为它们是最终类型。这意味着您不能使用它们来限制泛型参数,因为没有任何东西可以从它们继承。

    所以对于那种类型,答案是否定的。

    但是我们可以用 Java 做的是:

    您可以创建一个接受 Object 类型的方法。

     public <T> void doStaff(T obj) {
    
     }
    

    您可以创建一个仅限于 CharSequence 的方法,因为 String 是 final

     public <T extends CharSequence> void doStaff(T str){ 
    
     } 
    

    您可以创建一个仅限于一个接口的方法

    public <T extends CharSequence & Comparable<T>> void doStaf(T interf) {
    
    }
    

    但是即使有这么多的可能性,我们也无法创建对两种不相关类型有效的泛型参数。这是没有意义的。泛型类型的主要任务是提供类型安全。通常,当我们使用它们时,我们应该使用接口而不是类。

    【讨论】:

    • 我认为最后一个示例不是有效的 Java 代码。它会做什么?您如何使用类型一或二的类型?只有&amp; 在这里才真正有意义...
    • 据我所知,Comparable 似乎是一个接口,所以它没有被扩展,它被实现了 ;-)
    • @santirivera92,接口可以通过接口扩展,也可以通过类实现。
    • @santirivera92,Serializable 或 Comparable 经常被继承 ;-)。
    【解决方案4】:

    如果您希望您的方法接受整数和字符串,请尝试以下方法:

      public class Test {
    public static void main(String[] a)  {
        method(new String(),new Integer("2"));
    }
    public static <T extends String, U extends Integer> void  method(T t, U u){
    
    }
    }
    

    编辑:

    如果您希望您的方法采用单个参数,该参数采用字符串或整数

    试试这个:

    public static <T extends Comparable<T>> void  method(T t){
    
    }
    

    【讨论】:

    • 不能从 String 或 Integer 扩展,它们是 final 类型。
    • @Vash 虽然您无法扩展字符串或整数,但它适用于泛型。上面的代码将编译。 :)
    • 你正在使用什么 JVM?肯定在 5 和 6 上不会编译。
    • @Vash 你试过编译代码吗?我的 JVM 版本是 1.6.0_23
    • @Vash 它会给你以下警告,而不是错误,.. 类型参数 U 不应受最终类型 Integer 的限制。最终类型不能进一步扩展 - 类型参数 T 不应受最终类型 String 的限制。最终类型无法进一步扩展
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多