正如我们所知,如果我们想要重载现有方法,我们应该以某种方式改变参数的数量或参数的类型。这是我的困境,我想使用set类型绑定不同子类型的重载
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;
}
在上面这种情况下我怎么能使用过载呢? 对于第一个参数 在第一种方法中:设置 第二种方法:设置
答案 0 :(得分: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
是object
的子类,但由于java严格检查类型,编译器可以根据它确定正确的方法。
根据您的情况,我们认为争论的类型(比如arg
)是Set
而不是Set of <Type>
。
更清楚arg instanceof Set
&gt;&gt; true
但
arg instanceof Set<Type>
&gt;&gt; Compilation error
因此,编译器会将(Set和Set)视为同一类型Set
。
为了理解,在收集的情况下,类型确定Collection
的内容,而不是确定类型是List
还是Set