3
 public class Service{ 
       String serviceName;
      //setter and getter
  }

  public class Version{ 
       int VersionID;
      //setter and getter
  }

  public void test(Object list){

        //it shd print the obtained list

   }

リスト < サービス > list1; //Service は Bean
List< Version> list2; //バージョンはBean
テスト(list1);
テスト (list2);

ここで、テスト メソッド shd が取得したリストを出力します。(つまり) リストのタイプがServiceの場合、その getter を使用して serviceName を出力する必要があります。リスト タイプがVersionの場合、 versionID を出力する必要があります。
インターフェイスまたは抽象クラスを使用せずにこれを達成することは可能ですか?

4

4 に答える 4

0

@danLeonは、とtoStringにアクセスできることを前提として、これまでで最も単純なアイデア(クラスに追加)を持っています。ServiceVersion

なぜリフレクションを考えていたのかはわかりませんが、私が考えることができる唯一のことは、単一の属性Stringゲッターを持つ任意のオブジェクトで機能するものが必要であり、次にこのようなことを行うことです(クレイジーIMO、しかし、それは反射を使用します):

Class clazz = list.get(0).getClass();
Method[] methods = clazz.getDeclaredMethods();
Method onlyStringGetter = null;
for (Method method: methods) {
    String mName = method.getName();
    if (mName.matches("get\w+") {
        if (method.getReturnType().equals(String.class) {
            if (onlyStringGetter != null) thrown new RuntimeException("More than one String getter available");
            onlyStringGetter = method;
        }
    }
}
if (onlyStringGetter == null) throw new RuntimeException("No String getter found for class: " + clazz.getName());
List<String> strings = new ArrayList<String>();
for (Object singleStringAttribObj: list) {
    // some exception handling needed for below
    String result = (String)onlyStringGetter.invoke(singleStringAttribObj);
    strings.add(result);
}
System.out.println(strings);

私はコンパイルも試しもしていませんが、それはほぼ正しいです。確かに、いくつかの追加の例外処理が必要です

于 2012-06-29T15:12:35.940 に答える
0
static public class Service {

    String serviceName;

    @Override
    public String toString() {
        return serviceName;
    }
}

static public class Version {

    String VersionID;

    @Override
    public String toString() {
        return VersionID;
    }
}

static public void test(List<?> list) {
    for (Object object : list) {
        System.out.println(object.toString());
    }
}
于 2012-06-29T14:45:43.140 に答える
0
if(Object instanceof List) {
    List list = (List)Object ;

   for(int index=0; index < list.length();index++) {
       Object obj = list.get(index);

       if(obj instanceof Service) {
         //cast to service and print value or use reflection
           Service service= (Service)obj ;
           System.out.println(service.geServiceName());
       } else if(obj instanceof Version) {
          // cast to Version and print versionID  someting
          Version version = (Version)obj ;
          System.out.println(version.getVersionId());
     }
   }
}
于 2012-06-29T14:40:26.403 に答える
0
public void test(Object list) {
    if(list instanceof List)
        test((List)list);
}

public void test(List<?> list) {
    if (!list.isEmpty()) {
        Object o = list.get(0);
        if (o instanceof Version) {
            @SuppressWarnings("unchecked")
            List<Version> lVersion = (List<Version>) list;
            for (Version v : lVersion) {
                System.out.println(v.getVersionID());
            }
        } else if (o instanceof Service) {
            @SuppressWarnings("unchecked")
            List<Service> lService = (List<Service>) list;
            for (Service s : lService) {
                System.out.println(s.getServiceName());
            }
        }
    }
}
于 2012-06-29T14:41:55.293 に答える