有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java泛型函数中访问具体属性

我不熟悉Java泛型。我编写了一个函数,如下所示:

  public class C<T extends MyClass> implements MyInterface<T>{
      public void f(T obj){
         ...
         obj.getName()
      }
   }

上面的函数f是为两种类型的对象MySubClass1MySubClass2调用的MySubClass1MySubClass2是从抽象类MyClass继承的两个具体类,nameMySubClass2的一个属性

当用对象MySubClass2调用f时,我希望访问上面的名称。我不知道该怎么做


共 (2) 个答案

  1. # 1 楼答案

    在将T约束为MyClass的通用方法中,只有MyClass的方法可用。由于getName只在MySubClass2中实现,因此在没有对MySubClass2进行强制转换的情况下,您无法访问getName,这与使f()方法具有通用性的目的背道而驰

    您可以传递一个Function对象,该对象将nameT拉到f(),如下所示:

    public void f(T obj, Function<T,String> getName){
        ...
        String name = getName.apply(obj);
    }
    

    调用者调用f()的方式如下:

    MySubClass2 s2 = new MySubClass2();
    MyInterface<MySubClass2> c = new C<>();
    c.f(s2, MySubClass2::getName);
    

    请注意,这种技术允许您在MySubClass1对象上调用f,只要您提供一些获得名称的方法:

    MySubClass1 s1 = new MySubClass1();
    MyInterface<MySubClass1> c = new C<>();
    c.f(s1, x -> "<no-name>");
    
  2. # 2 楼答案

    ...and name is an attribute of MySubClass2

    那么你的方法就不能依赖它的存在,因为obj可以是MyClass派生的任何东西

    这意味着您的设计应该改变,要么使用单独的方法,要么将名称移动到MyClass

    你可以通过instanceof检查和演员阵容来做到:

    if (obj instanceof MySubClass2) {
        String name = ((MySubClass2)obj).getName();
    }
    

    。。。但是十有八九,使用instanceof会让你后退一步,重新考虑你的设计