我是Java泛型的新手。我写了一个如下函数:
public class C<T extends MyClass> implements MyInterface<T>{
public void f(T obj){
...
obj.getName()
}
}
针对两种类型的对象f
和MySubClass1
调用上面的函数MySubClass2
。 MySubClass1
和MySubClass2
是从抽象类MyClass
继承的两个混凝土类,name
是MySubClass2
的属性。
当使用MySubClass2
的对象调用f时,我想访问上面的名称。我无法弄清楚如何做到这一点。
答案 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
对象,将name
从T
提升为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>");