2015-10-15 56 views
1

正如我们知道如果我们想重载现有方法,我们应该以某种方式更改参数数量或参数类型。这里是我的困境,我想使用过载与集类型结合不同亚型设置类型参数的Java方法过载

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; 
} 

那还有我怎么能在这种情况下,使用上述超载的问题。 对于第一个参数 在第一种方法:设置 第二种方法:设置

+1

的区别是什么,到底是什么?就我所知,超载的问题是没有一个? –

+0

在第一种方法中,我们使用Set ,其次我们使用Set

+0

我认为你不能这样做。因为在运行时,类型将被删除,使这两个函数具有相同的方法参数(两个“Set”) –

回答

2

你误判方法重载:它关心的说法[Set]的类型,但不是它的通用亚型Set<Integer>]。 此外,仿制药只起到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 

String Eventhough是object一个亚类中,由​​于Java严格检查类型,编译器可以基于其正确的方法。

来到你的情况考虑arguement的类型(比如arg)是SetSet of <Type>

更清楚arg instanceof Set >>true
arg instanceof Set<Type> >>Compilation error

所以编译器会同时考虑(设置和设置)为同一类型Set的。

的理解,在征收的类型决定了Collection的内容,而不是确定的类型是否是一个ListSet

+0

@Ben Knoble查看我的更新 –