2

想像してみましょう:

public class Test
{
class A
{
    private String name = "toto";
    public String getId()
    {
        return name;
    }
}
class B
{
    int id = 99;
    public String getId()
    {
        return String.valueOf(id);
    }
}
public static void main(String[] args)
{
    Test t = new Test();

    A a = t.new A();
    B b = t.new B();

    List<A> list = new ArrayList<A>();
    list.add(a);
    list.add(a);
    list.add(a);

    List<?> genericList = list;

    for(Object obj : genericList)
        {
        System.out.println(obj.getId());
    }
}
}

コンパイル時に System.out.println にエラーがあります

The method getId() is undefined for the type Object

わかりました、それは正常です。

しかし、それを機能させるにはどうすればよいですか?のようなものを持つことは可能ですか?

((obj.getClass().getSimpleName())obj).getId()
4

4 に答える 4

0

いいえ、キャストは固定 (コンパイル時) クラスを使用して行われます。実際、それがその考え方であるため、コンパイラーは (プログラマーの介入により) どのクラスを扱っているかを認識します (そして、存在しないメソッドが呼び出されないようにすることができます)。

リフレクションを使用して、特定のオブジェクトからメソッドを動的に呼び出すことができますが、それよりも少し複雑です。

于 2013-05-24T12:06:23.113 に答える
0

良いアプローチは、と呼ばれるインターフェースを作成することです

public interface IdProvider {

  String getId();

}

それらを作成AしてB実装する

class A implements IdProvider
{
    private String name = "toto";
    public String getId()
    {
        return name;
    }
}
class B implements IdProvider
{
    int id = 99;
    public String getId()
    {
        return String.valueOf(id);
    }
}

ジェネリックがありますList<IdProvider>

List<IdProvider> list = new ArrayList<IdProvider>();
list.add(a);
list.add(a);
list.add(a);
list.add(b);
list.add(b);

for(IdProvider obj : genericList)
{
    System.out.println(obj.getId());
}
于 2013-05-24T12:11:03.350 に答える