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

时间:2017-12-30 10:21:52

标签: java generics

我是Java泛型的新手。我写了一个如下函数:

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

针对两种类型的对象fMySubClass1调用上面的函数MySubClass2MySubClass1MySubClass2是从抽象类MyClass继承的两个混凝土类,nameMySubClass2的属性。

当使用MySubClass2的对象调用f时,我想访问上面的名称。我无法弄清楚如何做到这一点。

2 个答案:

答案 0 :(得分:5)

  

...而name是MySubClass2的一个属性

然后,您的方法无法依赖它,因为obj可以来自MyClass

这表明您的设计应该更改,以便您拥有单独的方法或将名称移至MyClass

可以通过instanceof支票和演员

来执行此操作:

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

...但是十分之九,使用instanceof会让你退后一步并重新考虑你的设计。

答案 1 :(得分:0)

T约束为MyClass的通用方法中,只有MyClass的方法可用。由于getName仅在MySubClass2中实施,因此如果没有投放到getName,则无法访问MySubClass2,这与使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);

请注意,只要您提供某些获取名称的方式,此技术就可以在f个对象上调用MySubClass1

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