【问题标题】:Java method overload with Set type parameter带有 Set 类型参数的 Java 方法重载
【发布时间】:2015-10-16 00:08:05
【问题描述】:

我们知道如果要重载现有方法,我们应该以某种方式更改参数的数量或参数的类型。这是我的困境,我想使用重载与集合类型绑定不同的子类型

private boolean usedOverlap(Set<Variable> useVars, Set<Value> list) {
    // TODO Auto-generated method stub
    for(Variable use:useVars){
        if(list.contains(use.getValue()))
            return true;
    }
    return false;
}

private boolean usedOverlap(Set<Value>vaset_A,Set<Value>vaset_B){
    Set<Value>intersection = new HashSet<Value>(vaset_A);
    intersection.retainAll(vaset_B);
    if(intersection.isEmpty())
        return false;
    else
        return true;
}

问题是在上面的这种情况下如何使用重载。 对于第一个参数 在第一种方法中:设置 第二种方法:设置

【问题讨论】:

  • 到底有什么区别?重载的问题是,据我所知,没有?
  • 第一种方法我们使用 Set 第二种方法我们使用 Set
  • 我认为你做不到。因为,在运行时,类型将被删除,这使这两个函数具有相同的方法参数(两个 Set
  • 我的意思是这两种方法的最终结果有什么区别——它们是在相同的两个集合上做同样的事情,还是它们不同?如果相同,删除一个。如果不同,请重命名。

标签: java set overloading


【解决方案1】:

你误判了方法重载:它关心参数的类型[Set],而不关心它的泛型子类型[Set&lt;Integer&gt;]。 此外,泛型只在compile time 之前发挥作用。

更新:

Java 是一种严格类型检查的语言。所以下面的重载是可能的。

 public boolean overloadable(String b) {
       //....
        return false;
    }

    public boolean overloadable(Object a){
      //...
            return true;
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        System.out.println(sample.overloadable(12));//call Object arguement method
        System.out.println(sample.overloadable("12"));
    }

输出是:

true
false

虽然Stringobject的子类,但由于java严格检查类型,编译器可以根据它确定正确的方法。

根据你的情况考虑争论的类型(比如arg)是Set而不是Set of &lt;Type&gt;

更清楚arg instanceof Set >> true 但是
arg instanceof Set&lt;Type&gt; >> Compilation error

因此编译器会将 (Set 和 Set) 都视为同一类型 Set

为了理解,在收集的情况下,类型确定Collection的内容,而不是确定类型是List还是Set

【讨论】:

    猜你喜欢
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    相关资源
    最近更新 更多