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!
}
}