【问题标题】:java genric classes not working ? <Integer> depricatedjava泛型类不起作用? <整数> 已弃用
【发布时间】:2019-10-03 06:15:19
【问题描述】:

我无法使用Integer 创建通用类。它适用于String,但当涉及Integer 时,它表示Java 已弃用API 被覆盖。 我可以为泛型 Integer 类型做什么?

class Student<Type> {

    private Type t;

    public void SetData(Type t) {
        this.t = t;
    }

    public void GetData() {
        System.out.println(t);
    }
}

public static void main(String[] args) {
    Student<String> s1 = new Student<String>();
    Student<Integer> s2 = new Student<Integer>();
    String s;

    s= "what the hell";
    s1.SetData(s);
    s1.GetData();
    s2.SetData(new Integer(5));
    s2.getdata();   
}

【问题讨论】:

  • 您能否从控制台打印确切的错误。问题很不清楚。
  • @martijnp 我实际上只是将所有内容缩进了 4 个空格,以便将其格式化为代码。
  • @Sweeper 我指的是第一行,根据你在学生类定义后面添加 的变化
  • 在标识 &lt;Type&gt; 被解释为 html 标记之前,未显示。它在格式化后变得可见。
  • @martijnp 如果您查看并排降价,它显示&lt;Type&gt; 在编辑之前就在那里。问题是,因为它没有被格式化为代码,所以它没有被渲染(因为 HTML)。

标签: java generics integer


【解决方案1】:

这不是泛型的问题本身

弃用警告实际上是关于这一行的:

    s2.SetData(new Integer(5))

Integer(int) 构造函数一直是个坏主意,现在它已被正式弃用(从 Java 9 开始)。 javadoc 是这样说的:

"已弃用。 很少适合使用此构造函数。静态工厂 valueOf(int) 通常是更好的选择,因为它可能会产生明显更好的空间和时间性能。”

你应该把上面写成

    s2.SetData(Integer.valueOf(5))

或者更好:

    s2.SetData(5)

并依靠自动装箱。

new Integer(5) 的问题是:

  • 语义有点不同;例如

      new Integer(5) != new Integer(5)
      Integer.valueOf(5) == Integer.valueOf(5)
    
  • 可能不必要地创建Integer对象。

也有可能在未来的某个时候(当 值类型 完全实现时),在某些用例中,已弃用的形式可能会变成完全错误的错误。


郑重声明,如果您遵循原始警告中的建议,您会得到以下结果:

$ javac Genric.java 
Genric.java:24: error: cannot find symbol
           s2.getdata();    
             ^
  symbol:   method getdata()
  location: variable s2 of type Student<Integer>
Note: Genric.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
1 error

$ javac -Xlint:deprecation Genric.java 
Genric.java:23: warning: [deprecation] Integer(int) in Integer has been deprecated
           s2.SetData(new Integer(5));
                      ^
Genric.java:24: error: cannot find symbol
           s2.getdata();    
             ^
  symbol:   method getdata()
  location: variable s2 of type Student<Integer>
1 error
1 warning
$ 

“找不到符号”错误是因为您将方法声明为 GetData 而不是 getdata


这让我想到了最后一点。风格1

  1. 方法名称应始终以小写字母开头,并且应为“驼峰式”。例如:

      getData // correct
      GetData // incorrect
      getdata // incorrect
    
  2. 通用参数名称通常是单个大写字母;

      class Student<T>     // correct
      class Student<Type>  // incorrect
    
  3. 此外,Type 是一个糟糕的选择,因为在 java.lang 中有一个 Type 类。

  4. 正确的拼写很重要2,尤其是在公共类和方法名中:Genric 应该是 Generic

  5. 您的代码应该一致地缩进。每个级别最好有 4 个空格(不是 TAB 字符)。

  6. 对行中的空白保持一致:

        s= "what the heck";
    

    太丑了。每个二元运算符前后都应该有一个空格。

1 - 我注意到有人帮助修复了很多样式错误。我指的是您最初发布的代码样式;即您希望我们阅读的内容

2 - 不得不针对名称拼写错误的 API 编写代码真的很烦人。如果您写“颜色”与“颜色”,以及其他有替代拼写的情况,大多数人都会原谅您。但是,如果您不确定,请查字典。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2016-01-26
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 2013-10-12
    相关资源
    最近更新 更多