Java中的泛型方法可以限制可接受的类型吗?

时间:2018-09-13 06:22:34

标签: java generics

我对this question有类似的要求。 我想泛化一种方法,但通过通用参数限制可接受的类型。目前,我正在尝试将方法转换为可接受的类型,但是如果要处理2种或3种以上的类型,则显得很麻烦。

编辑
这些类型可能不是相同的基类。抱歉,我们之前没有提及。

2 个答案:

答案 0 :(得分:1)

为此,您必须具有基类,以便您可以执行此操作。

public class Person {
  String name;
  List<Profession> professions;
  int age;
}

public class Doctor {
  String university;
  Boolean doctorate;
  public void work() {
       // do work
  }
}

public class Teacher {
  List<Grade> grades;
  float salary;
  public void work() {
       // do work
  }
}

public class Animal<T> {
    T type;
}

因此,现在,如果您想编写一个通用且适用于所有人的方法,则可以执行以下操作

public void doSomething(Animal<T extends Person> human) {
  human.work();
}

如果该类不是Person类型,则将显示编译错误。

UPD1
在这种情况下,所有类都不具有公共基类。有一些使它们独特的功能。这样,我们可以认为它们具有共同的功能,我们可以并且应该使用界面来添加。

让我们看一些代码,

public class Human implements Growable {
  public void grow() {
    // human grow code
  }
}

public class Plant implements Growable {
  public void grow() {
    // plant grow code
  }
}

public class Table {
  // does not grows
}

public class GrowService {
  public static void grow(Growable growable) {
     growable.grow();
  }
}

interface Growable {
  public void grow();
}

然后通过调用以下方法,我们可以实现

// Works fine
GrowingService.grow(new Plant());
// throws compilation error
GrowingService.grow(new Table());

答案 1 :(得分:0)

Java泛型允许使用基本的通配符,例如<T>,但也可以使用更多的详细信息,例如

<T extends Number>表示T是Number或其子类的任何类型T或

<T super Number>,这意味着T可以一直是Number或Number直至Object为止的Number的任何超类。