【问题标题】:Unable to initialize data member of generic type无法初始化泛型类型的数据成员
【发布时间】:2021-12-18 06:24:08
【问题描述】:
class A <T>{
T a;

A(){
    a=89l;//error: incompatible types: long cannot be converted to T
}
    
}
public class Main extends Exception{
    
    public static void main(String[] args) {

    }
}

为什么它给了我错误我做了所有的事情语法

【问题讨论】:

  • T 是一个泛型类型参数。这取决于任何代码实例化 A。如果有人创建了 A&lt;String&gt;A&lt;List&gt;,那么字段 a 将不是数字字段,因此尝试将其设置为 89L 没有意义。如果您希望 a 为 long,请不要将其声明为泛型类型。

标签: java class templates generics initialization


【解决方案1】:

正如错误所说:您只能将类型为T 的表达式分配给a

89L 是 long 类型的表达式。 T 可以是任何东西。因此,89L,或者就此而言,任何表达式都不可能是 T 类型,除非您已经拥有 T 类型的表达式。

这是可行的,实际上是唯一获得类型 T 表达式的方法:

class A<T> {
  T a;

  A(T in) {
   this.a = in;
  }
}

您需要从调用者或调用者提供的东西中获取类型 T 的表达式。也可以是 Supplier&lt;T&gt;List&lt;T&gt; 甚至是 List&lt;? extends T&gt; - 但无论如何,您需要呼叫者给您一些东西,这样您就可以得到一个 T,因为您无法制作一个你自己的。

泛型用于链接事物。泛型让您声明:“我不知道 T 可能是什么,但我想编写一个参数类型与返回类型相同的方法”。换句话说,当您使用泛型时,您必须在至少 2 个地方使用它们:因为它用于链接不同位置的类型,所以使用它们一次完全没用。在您的示例中,您只使用它一次,这使得泛型无用。

换句话说,您似乎不了解泛型的用途,这是您的根本问题。如果您想为a 字段分配一个长值,而不管您的班级的用户可能希望做什么,那么您的字段应该简单地声明为private long a;,而不是private T a;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多