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);
但只是好奇,我怎么能通过明确指定类型证人来做到这一点...
这就是你的代码不起作用的原因。
通过框
通过替换已知的泛型参数,
框的构造函数签名
<X> Box(Integer p1, X p2)
这就是您如何调用构造函数:
new Box<String,Integer>("Mahesh",11)
您给它一个
字符串
作为第一个参数,但构造函数需要一个整数
。编译器错误!
你有很多方法来解决这个问题。交换两个泛型类型参数的位置,或者在调用构造函数时交换参数的位置。
回答你的问题:
我如何通过显式指定类型见证来做到这一点...
在new
和类名之间放入尖括号:
new <TypeWitnessForConstructor> Box<TypeArgumentsForInstance>(...)
但正如Sweeper的回答所示,这并不是代码的问题。
问题内容: 如果我有一个像这样的抽象类: 还有一些从Item派生的类是这样的: 我不明白为什么我不能使用泛型调用构造函数: 我知道可以有一个没有构造函数的类型,但是这种情况是不可能的,因为Pencil具有没有参数的构造函数,而Item是抽象的。但是我从eclipse中得到了这个错误: 无法实例化 我不明白为什么的 T类型 ,以及如何避免这种情况? 问题答案: 无法使用Java类型系统来强制类层次结
可能的重复: 为什么this()和super()必须是构造函数中的第一条语句? 为什么子类构造函数必须显式调用超类构造函数?这是什么原因呢?
问题内容: 可以这么说,我有一个扩展超类的子类。在什么情况下我需要显式键入以使超类构造函数运行? 我正在看一本书中有关抽象类的示例,当它们使用非抽象子类对其进行扩展时,该子类的默认构造函数为空,并且有一条评论说将调用超类的默认构造函数。同时,我还在这里看到有人未明确致电问题的实例。 与从子类的默认/非默认构造函数调用超类的默认/非默认构造函数有区别吗? 问题答案: 你 永远都不 需要 如果您不指定
为什么下面没有编译: 如有需要,请提供更多详细信息: 我想将tmp传递给父构造函数
假设我有以下课程: 我想添加一个构造函数,它需要一个
首先,这更像是一个理智检查问题,以获得比我更精通语言标准深度的人的认可。 假设我有以下类型(尽管我忽略了任何非构造函数和非赋值成员函数): 好吧,在任何合理的实现中,在内存中都不应该是普通的。但我对标准的保证很感兴趣。以下是我根据C 98/03定义POD的理由: 不能是 POD 类型,因为它具有非公共字段、基类和用户定义的构造函数。 和C 11的losened/扩展定义: > 它应该是微不足道的可