Java中防止方法调用的泛型

Java中防止方法调用的泛型,java,generics,composition,Java,Generics,Composition,因此,我有一个自定义类,如下所示: public class Cell { protected boolean wasActive; public Cell() { this.wasActive = false; } public boolean getPreviousActiveState() { return this.wasActive; } public void setPreviousActiveState(bool

因此,我有一个自定义类,如下所示:

public class Cell {
    protected boolean wasActive;

    public Cell() {
    this.wasActive = false;
    }

    public boolean getPreviousActiveState() {
    return this.wasActive;
    }

    public void setPreviousActiveState(boolean previousActiveState) {
    this.wasActive = previousActiveState;
    }
}
现在我在这里编写另一个类,我需要调用上面的getPreviousActiveState()方法:

公共类突触{
私人小区;
//其他一些方法…如断开连接
公共布尔getPreviousActiveState(){

this.cell.getPreviousActiveState;//定义一个名为
cell
的类型参数会造成一些混乱。让我们将其重命名为
T
,并将缺少的一对括号添加到
this.cell.getPreviousActiveState
调用中:

class Synapse<T> {
  private T cell;

  // some other methods... like isConnected

  public boolean getPreviousActiveState() {
    return this.cell.getPreviousActiveState(); // <= CAN'T BE CALLED. WHY?
  }
}
当然,您可以通过引入一个接口来定义您感兴趣的方法,并将此接口用作上限,从而使代码更加通用。您还必须使
单元格
实现此接口:

interface ActiveStateProvider {
  public boolean getPreviousActiveState();  
}

class Cell implements ActiveStateProvider {
  protected boolean wasActive;

  public Cell() {
    this.wasActive = false;
  }

  public boolean getPreviousActiveState() {
    return this.wasActive;
  }

  public void setPreviousActiveState(boolean previousActiveState) {
    this.wasActive = previousActiveState;
  }
}

class Synapse<T extends ActiveStateProvider> {
  private T cell;

  // some other methods... like isConnected

  public boolean getPreviousActiveState() {
    return this.cell.getPreviousActiveState(); // <= Compiles!
  }
}
接口ActiveStateProvider{
公共布尔getPreviousActiveState();
}
类单元格实现ActiveStateProvider{
受保护的布尔值是活动的;
公共单元格(){
this.wasActive=false;
}
公共布尔getPreviousActiveState(){
返回此.wasActive;
}
public void setPreviousActiveState(布尔值previousActiveState){
this.wasActive=previousActiveState;
}
}
类突触{
私人T细胞;
//其他一些方法…如断开连接
公共布尔getPreviousActiveState(){

返回this.cell.getPreviousActiveState();//定义一个名为
cell
的类型参数意味着会产生一些混乱。让我们将其重命名为
T
,并将缺少的一对括号添加到
this.cell.getPreviousActiveState
调用中:

class Synapse<T> {
  private T cell;

  // some other methods... like isConnected

  public boolean getPreviousActiveState() {
    return this.cell.getPreviousActiveState(); // <= CAN'T BE CALLED. WHY?
  }
}
当然,您可以通过引入一个接口来定义您感兴趣的方法,并将此接口用作上限,从而使代码更加通用。您还必须使
单元格
实现此接口:

interface ActiveStateProvider {
  public boolean getPreviousActiveState();  
}

class Cell implements ActiveStateProvider {
  protected boolean wasActive;

  public Cell() {
    this.wasActive = false;
  }

  public boolean getPreviousActiveState() {
    return this.wasActive;
  }

  public void setPreviousActiveState(boolean previousActiveState) {
    this.wasActive = previousActiveState;
  }
}

class Synapse<T extends ActiveStateProvider> {
  private T cell;

  // some other methods... like isConnected

  public boolean getPreviousActiveState() {
    return this.cell.getPreviousActiveState(); // <= Compiles!
  }
}
接口ActiveStateProvider{
公共布尔getPreviousActiveState();
}
类单元格实现ActiveStateProvider{
受保护的布尔值是活动的;
公共单元格(){
this.wasActive=false;
}
公共布尔getPreviousActiveState(){
返回此.wasActive;
}
public void setPreviousActiveState(布尔值previousActiveState){
this.wasActive=previousActiveState;
}
}
类突触{
私人T细胞;
//其他一些方法…如断开连接
公共布尔getPreviousActiveState(){

返回此.cell.getPreviousActiveState();//这不是你使用泛型的方式。
公共类Synapse
然后使用
T
。然后将其作为方法调用…@jlordo你能解释为什么它必须是这样吗?这不是你使用泛型的方式。
公共类Synapse
然后使用
T
。然后将其作为方法调用…@jlordo你能解释为什么它必须是这样吗是这样吗?
interface ActiveStateProvider {
  public boolean getPreviousActiveState();  
}

class Cell implements ActiveStateProvider {
  protected boolean wasActive;

  public Cell() {
    this.wasActive = false;
  }

  public boolean getPreviousActiveState() {
    return this.wasActive;
  }

  public void setPreviousActiveState(boolean previousActiveState) {
    this.wasActive = previousActiveState;
  }
}

class Synapse<T extends ActiveStateProvider> {
  private T cell;

  // some other methods... like isConnected

  public boolean getPreviousActiveState() {
    return this.cell.getPreviousActiveState(); // <= Compiles!
  }
}