【问题标题】:Setting generic variable value in Java在 Java 中设置泛型变量值
【发布时间】:2021-09-17 08:34:47
【问题描述】:

我有一个全局变量页面

private T page

另外,我还有一个setter方法;

public <T> void setGenericVar(T page) {
this.page = page
}

我在主程序中的调用是这样的;

setGenericVar("one");
setGenericVar(1);

我得到的错误是在setter方法中:

Required type: T
Provided: T
"Change parameter 'page' type to 'T'"

我在函数中需要一个 T 参数,但我也在证明它,所以我没有收到这个错误!

编辑:此代码出现问题:

public class GenericVariables<T> {
   private T page;
   public void main (String args[]) {
     setGenericVar(2);
   }
   public <T> void setGenericVar(T page) {
     this.page = page
   } 
}

【问题讨论】:

  • 你能显示minimal reproducible example吗?
  • 如果您在类级别将T 定义为泛型类型,则无需在方法级别指定它......但是使用您提供的代码很难说出实际问题是
  • 我已经添加了我的实际问题,不便之处请见谅:(

标签: java generics global-variables setter generic-method


【解决方案1】:

问题的发生是因为 lealceldeiro 在评论中提到的:您已经在类和方法上指定了类型参数。它们都被命名为T,但它们是独立的类型参数,所以它们确实不同。

public class GenericVariables<T> { // Type parameter <T> on class here
    private T page;

    public void main (String args[]) {
        setGenericVar(2);
    }

    // Type parameter <T> on method here
    public <T> void setGenericVar(T page) {
        this.page = page;
    } 
}

如果你给它们起不同的名字,就会更容易看到发生了什么:

public class GenericVariables<T> {
    private T page;

    public void main (String args[]) {
        setGenericVar(2);
    }

    public <U> void setGenericVar(U page) {
        // ERROR: this.page is of type T, but the parameter page is of type U
        this.page = page;
    } 
}

解决方法:从方法中去掉类型参数;让它使用类的类型参数即可。

public class GenericVariables<T> {
    private T page;

    public void main (String args[]) {
        setGenericVar(2);
    }

    public void setGenericVar(T page) {
        this.page = page;
    } 
}

注意:您的main 方法不是static,因此Java 不会将其视为您程序的入口点;你不能从这个main 方法开始运行你的程序。您需要将其设为static。如果这样做,则不能直接调用setGenericVar 方法。您需要创建该类的一个实例并在其上调用方法:

public class GenericVariables<T> {
    private T page;

    public static void main (String args[]) {
        GenericVariables<Integer> object = new GenericVariables<>();
        object.setGenericVar(2);
    }

    public void setGenericVar(T page) {
        this.page = page;
    } 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2011-05-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    相关资源
    最近更新 更多