JAVA 方法在相同的 class 和相同的实现中,但不同的对象类型作为参数

JAVA methods in same class and same implementation but different object types as parameter

java中处理三种方法相同class 相同的植入 不同的对象类型作为参数
因为我不喜欢重复代码
有一个参数为 Set < Object >

的方法是好的还是可能的

EX :

public static String M1(Set<Book> set) {
    Iterator<Book> first = set.iterator();
    String id1 = "";
    while (first.hasNext()) {
         id1 = first.next().getName();
        if (id1.equalsIgnoreCase("ABC")) {
    return id1 ;
        }
    }
    return id1 ;

}

public static String M2(Set<Student> set) {

Iterator<Student> first = set.iterator();
    String id1 = "";
    while (first.hasNext()) {
         id1 = first.next().getName();
        if (id1.equalsIgnoreCase("ABC")) {
    return id1 ;
        }
    }
    return id1 ;

}

public static String M3(Set<Course> set) {

    Iterator<Course> first = set.iterator();
    String id1 = "";
    while (first.hasNext()) {
         id1 = first.next().getName();
        if (id1.equalsIgnoreCase("ABC")) {
    return id1 ;
        }
    }
    return id1 ;

}

好吧,从某些角度来看,是的,您 can.Although 需要额外的信息,泛型是一种可行的方法。您可以使用一种带有签名的方法,例如:

public <T> String M1(Set<T> t){
    return t.toString();
}

尽管请注意,您要么限于 Object 的方法,要么必须声明具有通用功能的接口而不是 <T>

<T extends InterfaceName>

理想情况下,您的 BookStudentCourse 类 将实现一个公共接口,该接口提供对 getName() 方法的访问。那么你可以这样做:

public static String M(Set<? extends HasName> set) {

    Iterator<? extends HasName> first = set.iterator();
    String id1 = "";
    while (first.hasNext()) {
         id1 = first.next().getName();
        if (id1.equalsIgnoreCase("ABC")) {
    return id1 ;
        }
    }
    return id1 ;

}

请注意,增强的 for 循环在这里会更整洁:

String id1 = "";
for (HasName n : set) {
  id1 = n.getName();
  if (id1.equalsIgnoreCase("ABC")) { return id1; }
}
return id1;

如果他们不这样做,您仍然可以定义一个包含逻辑的方法:

public static <T> String common(Set<T> set, Function<? super T, String> extractor) {

    Iterator<T> first = set.iterator();
    String id1 = "";
    while (first.hasNext()) {
         id1 = extractor.apply(first.next());
        if (id1.equalsIgnoreCase("ABC")) {
    return id1 ;
        }
    }
    return id1 ;

}

然后您需要直接调用它:

String fromBook = common(setOfBooks, Book::getName);

或者提供调用常用方法的方法:

String M1(Set<Book> set) {
  return common(set, Book::getName);
}

String M2(Set<Student> set) {
  return common(set, Student::getName);
}

String M3(Set<Course> set) {
  return common(set, Course::getName);
}

请注意,由于类型擦除,它们必须有不同的名称。