我想编写一个可以接受两种相似类型的函数。但不一样。
MyClassA {
abc()
a2b()
}
MyClassB {
abc()
a3b()
}
这两种方法相同。该函数应该接受这两种类型中的任何一种的列表,并且我想在列表中的对象上调用abc()。
这似乎没有帮助:
private <T> Set<MyclassX> createObject(List<T> classes) {
Set<MyclassX> x;
if ( T instanceof MyClassA) {
for ( MyClassA a : classes ) {
if (a.abc().equals("somethig")) {
x.add( t.abc());
}
}
}
return x;
}
我甚至不需要检查instanceof
。我只需要遍历列表并比较值。如果匹配,则调用方法abc()
答案 0 :(得分:8)
只需创建一个通用界面,让MyClassA和MyClassB实现它:
interface MyClass {
void abc();
}
答案 1 :(得分:1)
我建议你像这样使用abstract super class
:
abstract SuperClass{
abc();
abstract ab(); // Only if the other methods share signatures
}
MyClassA extends SuperClass {
ab();
}
MyClassB extends SuperClass{
ab();
}
private <T> Set<? extends SuperClass> createObject(List<T> classes) {
...
}
如果您只想迭代包含MyClassA
和MyClassB
实例的集合,请在这些实例上调用方法abc()
。
这可以与JPA
一起使用,因为有一个注释所谓的MappedSuperclass。
通过这种方式,您可以以符合您要求的方式从后代类中分解相同的逻辑,并且可以与泛型一起使用。这是how to use
的Hibernate示例答案 2 :(得分:0)
使用泛型,您可以这样做:
private <T> Set<MyclassX> createObject(List<T> classes) {
Set<MyclassX> x;
for ( T a : classes ) {
if (a.abc().equals("somethig")) {
x.add( t.abc());
}
}
}
return x;
}
假设t.abc()
返回MyclassX
。 (我的意思是字面意思,我不是假设X
代表别的东西。)
答案 3 :(得分:0)
类型信息可以作为参数传递
<T> void method(Class<T> clazz, List<T> list)
{
if(clazz==MyClassA.class)
{
@SuppressWarnings("unchecked)
List<MyClassA> listA = (List<MyClassA>)list;
....
}
else if...
更好的解决方案可能是在将List<MyClassX>
传递给List<Abc>
之前将其传递给
interface ABC
abc()
void method(List<Abc> list)
在java8中转换可能很容易
List<MyClassA> list1 = ...
method( list1.map( e->e.abc() ) );