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
   }

}