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>
理想情况下,您的 Book
、Student
和 Course
类 将实现一个公共接口,该接口提供对 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);
}
请注意,由于类型擦除,它们必须有不同的名称。
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>
理想情况下,您的 Book
、Student
和 Course
类 将实现一个公共接口,该接口提供对 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);
}
请注意,由于类型擦除,它们必须有不同的名称。