当前位置: 首页 > 知识库问答 >
问题:

通过显式指定类型见证调用类构造函数

凌恩
2023-03-14

Java泛型类型推断的Oracle文档给出了以下示例:

class MyClass<X> {
  <T> MyClass(T t) {
    // ...
  }
}

考虑类MyClass的以下实例化:

newmyclass

该语句明确指定形式类型参数X的类型Integer。编译器为形式类型参数T推断类型String,因为此构造函数的实际参数是字符串对象。

我试图用这个做实验。我定义了以下类:

class Box<T,S> 
{
    T item;
    S otherItem;

    <X> Box(S p1, X p2)
    {
        otherItem = p1;
    }

    public static void main(String[] args) 
    {
        /* Below gives compile time error:
           The constructor Box<String,Integer>(String, int) is undefined
        */
        Box box4 = new Box<String,Integer>("Mahesh",11);
    }
}

上面对构造函数的调用给了我编译时错误:

The constructor Box<String,Integer>(String, int) is undefined

我知道我可以通过指定菱形来实现这一点:

Box box4 = new Box<>("Mahesh",11);

但只是好奇,我怎么能通过明确指定类型证人来做到这一点...


共有2个答案

酆晔
2023-03-14

这就是你的代码不起作用的原因。

通过

通过替换已知的泛型参数,框的构造函数签名

<X> Box(Integer p1, X p2)

这就是您如何调用构造函数:

new Box<String,Integer>("Mahesh",11)

您给它一个字符串作为第一个参数,但构造函数需要一个整数。编译器错误!

你有很多方法来解决这个问题。交换两个泛型类型参数的位置,或者在调用构造函数时交换参数的位置。

陆卓
2023-03-14

回答你的问题:

我如何通过显式指定类型见证来做到这一点...

new和类名之间放入尖括号:

new <TypeWitnessForConstructor> Box<TypeArgumentsForInstance>(...)

但正如Sweeper的回答所示,这并不是代码的问题。

 类似资料:
  • 问题内容: 如果我有一个像这样的抽象类: 还有一些从Item派生的类是这样的: 我不明白为什么我不能使用泛型调用构造函数: 我知道可以有一个没有构造函数的类型,但是这种情况是不可能的,因为Pencil具有没有参数的构造函数,而Item是抽象的。但是我从eclipse中得到了这个错误: 无法实例化 我不明白为什么的 T类型 ,以及如何避免这种情况? 问题答案: 无法使用Java类型系统来强制类层次结

  • 可能的重复: 为什么this()和super()必须是构造函数中的第一条语句? 为什么子类构造函数必须显式调用超类构造函数?这是什么原因呢?

  • 问题内容: 可以这么说,我有一个扩展超类的子类。在什么情况下我需要显式键入以使超类构造函数运行? 我正在看一本书中有关抽象类的示例,当它们使用非抽象子类对其进行扩展时,该子类的默认构造函数为空,并且有一条评论说将调用超类的默认构造函数。同时,我还在这里看到有人未明确致电问题的实例。 与从子类的默认/非默认构造函数调用超类的默认/非默认构造函数有区别吗? 问题答案: 你 永远都不 需要 如果您不指定

  • 为什么下面没有编译: 如有需要,请提供更多详细信息: 我想将tmp传递给父构造函数

  • 假设我有以下课程: 我想添加一个构造函数,它需要一个

  • 首先,这更像是一个理智检查问题,以获得比我更精通语言标准深度的人的认可。 假设我有以下类型(尽管我忽略了任何非构造函数和非赋值成员函数): 好吧,在任何合理的实现中,在内存中都不应该是普通的。但我对标准的保证很感兴趣。以下是我根据C 98/03定义POD的理由: 不能是 POD 类型,因为它具有非公共字段、基类和用户定义的构造函数。 和C 11的losened/扩展定义: > 它应该是微不足道的可