我使用了不同类型的多个LinkedList
,例如:
LinkedList<A> typeA = new LinkedList<>();
LinkedList<B> typeB = new LinkedList<>();
LinkedList<C> typeC = new LinkedList<>();
然后我想根据类型打印它们,因此对于每种类型我都会调用相应的函数。
void funcA(LinkedList<A> ls)
void funcB(LinkedList<B> ls)
void funcC(LinkedList<C> ls)
我想知道是否可以选择调用一个函数并在函数内部检查类型。 感谢有帮助的人!祝你有愉快的一天:)
答案 0 :(得分:1)
正如其他人所提到的,你可以使用像:
这样的通用函数public static <T> void genericFunc(LinkedList<T> ls) {
//you can do something with the list but
//you do not know what T is so you can't invoke T's methods
//(apart from those belonging to Object)
}
如果你想对T中包含的类型有额外的控制权,假设你的所有对象都是从基类A继承的,那么你可以这样做:
public static <T extends A> void genericFunc(LinkedList<T> ls) {
for (T t : ls){
t.somePublicMethodOfA();
}
}
答案 1 :(得分:0)
我将另一个通用参数用于该函数,以指示如何根据类型打印列表。
请参阅http://www.functionaljava.org/javadoc/4.7/functionaljava/fj/Show.html
示例:
void func<A>(LinkedList<A> list, Show<A> aShow) {
listShow(aShow).printLn(list)
}
如果您使用Scala,则会使Show[A]
成为隐式参数。
答案 2 :(得分:-1)
您可以使用通用方法。
public <T> void func(LinkedList<T> ls) { // T can be any type
// do something
}
答案 3 :(得分:-1)
您可以在方法的list参数中使用未绑定的泛型类型,它将如下所示:
public static void main(String[] args) {
List<String> listStr = Arrays.asList("A","B","C");
List<Integer> listInt = Arrays.asList(1,2,3);
printList(listStr);
printList(listInt);
}
private static void printList(List<?> list) {
for(Object obj : list){
if(obj instanceof String){
String str = (String) obj;
System.out.printf("String: %s \n", str);
} else if(obj instanceof Integer){
Integer integer = (Integer) obj;
System.out.printf("Integer: %s \n", integer);
}
}
}