【问题标题】:Serious generics issue: int vs. Integer java严重的泛型问题:int vs. Integer java
【发布时间】:2012-10-02 12:49:50
【问题描述】:

很长一段时间以来,我一直试图让一段代码工作,但这是不可能的。我拥有的类需要一个我设置为整数的泛型。所以我尝试了以下方法:

public class a<T> //set generics for this function
{
    private T A;
    protected boolean d;

    public a(final T A)
    {
        this.A = A;

        //do calculations
        //since constructor cannot return a value, pass to another function.
        this.d = retnData(Integer.parseInt(A.toString()) != 100); //convert to an integer, the backwards way.
    }
    private boolean retnData(boolean test)
    {
        return test;
    }
}
// IN ANOTHER CLASS
transient a<Integer> b;
boolean c = b.d = b.a(25); // throws an erorr: (Int) is not apporpriate for a<Integer>.a

Java 不允许这样做,因为 java 会看到 int != Integer,即使两者都接受相同的数据。由于泛型的工作方式,我无法设置 a b;因为 int 类型的原始性。即使转换为 Integer 也不起作用,因为它仍然会引发“类型错误”

最后,我不得不问一下是否有某种解决方法,或者尝试让它工作是徒劳的?

【问题讨论】:

  • 如果您不竭尽全力对代码进行模糊处理,那么现在每个想要帮助您的人都需要进行去混淆处理。

标签: java generics types int


【解决方案1】:

您正试图将构造函数显式调用为实例方法。这不能在 Java 中完成。

也许你想要:

transient a<Integer> b = new a<Integer>(25);
boolean c = b.d;

但是,由于 d 被声明为 protected,因此只有在此代码位于从 a 派生的另一个类中或在同一个包中时,这才有效。

【讨论】:

    【解决方案2】:

    使用

    final a<Integer> b = new a<Integer>(10); 
    boolean c = b.d;
    

    int 可以通过new Integer(10) 或Integer.valueOf(10) 显式转换为整数

    【讨论】:

    • 首选 Integer.valueOf(x)Integer 构造函数。 (特别是保证将Integer对象缓存25。)
    • 您始终可以将int 传递给需要Integer 的方法。
    • a(Integer) 是一个构造函数。无论您传递的是int 还是Integer,您都不能调用b.a
    • @LouisWasserman 实际上在简单的用例中 new Integer() 由于内联而快得多。
    • @Ted Hopp 是的,你完全正确,我没有看代码。他直接调用构造函数,而不是像 final a b = new a(10);
    【解决方案3】:

    代码没有多大意义:ba 类型的对象,它没有 a 方法 - 所以不确定你对 b.a(25) 的期望是什么;...这没什么与intInteger 相关...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 2018-12-16
      • 2013-10-07
      • 1970-01-01
      • 2020-11-30
      • 2014-07-19
      • 1970-01-01
      相关资源
      最近更新 更多