Casting-foreach-java
我有这样一种方法:Casting-foreach-java,java,list,casting,for-loop,foreach,Java,List,Casting,For Loop,Foreach,我有这样一种方法: private void myMethod(List<?> myLists) { for (Object val : myLists) { val.getMyOtherMethod(); // for example } } 在这种情况下,我不知道,巫婆子类我发送MySubclass1,MySubclass2或MySubclass3。这对于foreach循环很重要。您需要一个实现getMyOtherMethod()的元素列表 接口实
private void myMethod(List<?> myLists) {
for (Object val : myLists) {
val.getMyOtherMethod(); // for example
}
}
在这种情况下,我不知道,巫婆子类我发送MySubclass1,MySubclass2或MySubclass3。这对于foreach循环很重要。您需要一个实现getMyOtherMethod()的元素列表
接口实现GetMyotherMethod{
void getMyOtherMethod();
}
私有void myMethod(List定义/使用他们都实现的接口:
interface HasMyOtherMethod {
void getMyOtherMethod();
}
private <T extends HasMyOtherMethod> void myMethod(List<T> myLists) {
for (T val : myLists) {
val.getMyOtherMethod();
}
}
接口hasmothermethod{
void getMyOtherMethod();
}
私有void myMethod(列出MyList){
for(T val:myLists){
val.getMyOtherMethod();
}
}
编辑:添加了通用上限:HasmytherMethod的任何子类都可以使用
与强制转换相比,这种转换的优点是在编译时检查,而在运行时检查强制转换
如果可以的话,您总是希望进行编译时检查,否则您将面临编译、部署到生产环境的风险,然后有一天会在生产环境中的运行时爆炸。解决此问题的正确方法是使用泛型强制执行编译时类型检查。如果所有对象都实现了公共接口
interface IFoo {
Bar getMyOtherMethod();
}
然后myMethod
应该采用列表,而不是列表
:
private void myMethod(列出mylist)
{
for(IFoo val:myLists)
{
val.getMyOtherMethod();
}
}
如果您发现自己必须在equals()
之外施放,那么几乎可以肯定有一种更好的惯用方法来完成任务。如果可以,请避免同时施放:
private void myMethod(List<YourType> myLists) {
for (YourType val : myLists) {
val.getMyOtherMethod(); // for example
}
}
private void myMethod(列出mylist){
for(YourType val:myLists){
val.getMyOtherMethod();//例如
}
}
您只能强制转换为您的对象实际拥有的类型。在这里,拥有正确的方法是不够的。如果您有不同的类,它们都具有相同的方法,那么让它们实现一个提供该方法的接口
那你就可以了
for (Object val : myLists) {
((MyInterface) val).getMyOtherMethod();
}
或者(如果您有多种方法):
当然,您通常会使用List
而不是List
,并完全避免强制转换。您可以避免使用通用通配符进行强制转换
private void myMethod(List<? extends YourInterface> myLists) {
for (YourInterface val : myLists) {
val.getMyOtherMethod(); // for example
}
}
private void myMethod(如果您有hasmythermethod的任何子类型的列表,则该列表可以正常工作。我调用了myMethod几次,例如:List var1;List var1;List var1;……myMethod(var1);myMethod(var2);myMethod(var3);在这种情况下,我不知道,我发送了MySubclass1、MySubclass2或MySubclass3的witch子类。这对foreach循环很重要。Peter的解决方案更好,但总体思路相同。myMethod可以像myMethod(实现SiFoo的类的ListObjectOfClasses)一样调用吗
private void myMethod(List<YourType> myLists) {
for (YourType val : myLists) {
val.getMyOtherMethod(); // for example
}
}
for (Object val : myLists) {
((MyInterface) val).getMyOtherMethod();
}
for (Object val : myLists) {
MyInterface mi = (MyInterface) val;
mi.getMyOtherMethod();
mi.doSomething();
}
private void myMethod(List<? extends YourInterface> myLists) {
for (YourInterface val : myLists) {
val.getMyOtherMethod(); // for example
}
}