Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在C++;Java需要显式类型参数吗?_Java_C++_Parametric Polymorphism - Fatal编程技术网

为什么在C++;Java需要显式类型参数吗?

为什么在C++;Java需要显式类型参数吗?,java,c++,parametric-polymorphism,Java,C++,Parametric Polymorphism,C++和Java在处理参数多态性的方式上有这样的相似性:它们都会将类型参数推断为常规函数或方法,但要求程序员在调用构造函数时显式地给出类型参数(尽管在Java 7中有所更改) 这种行为背后的技术原因是什么 编辑:我错误地认为这也适用于Scala。 下面是一个来自Java的示例: class Foo<T> { Foo(T x) { } } <T> void foo(T x) { } Foo<Integer> f = new Foo(3); foo(

C++和Java在处理参数多态性的方式上有这样的相似性:它们都会将类型参数推断为常规函数或方法,但要求程序员在调用构造函数时显式地给出类型参数(尽管在Java 7中有所更改)

这种行为背后的技术原因是什么

编辑:我错误地认为这也适用于Scala。 下面是一个来自Java的示例:

class Foo<T> {
    Foo(T x) { }
}

<T> void foo(T x) { }


Foo<Integer> f = new Foo(3);
foo(3);
class-Foo{
Foo(tx){}
}
void foo(tx){}
Foo f=新的Foo(3);
傅(3);

这两种都是合法的,但是第一种创建了“原始类型”而不是<代码> Foo,并且执行未检查的赋值。

这是因为C++模板可以是专门的。 这意味着仅仅因为有一个主要的定义:

template<typename T>
class Foo
{
    Foo(T x) { }
};
它还接受一个
int
参数

将用户定义的类型转换添加到混合中,您会发现无法从函数参数中找出类的类型参数

事实上,构造函数的类型参数的推断是允许的。而不是类模板参数的推断。例如,在构造智能指针时允许隐式向上投射:

template<typename T>
class a_smart_ptr
{
    template<typename TOther>
    a_smart_ptr(TOther* p) { }
};
模板
a级\u智能\u ptr
{
模板
a_smart_ptr(TOther*p){}
};

我不太明白-你能举个例子吗?具体来说,您所说的“…在调用时显式给出类型参数…”Scala将在构造函数调用中推断类型参数,例如
class C[T];val c:c[Int]=新的c
类别c[T];def foo(c:c[Int]){};foo(新C)
@MikeD好的,我给出了一个来自Java的例子。@SethTisue是的,谢谢;我很困惑,因为Scala在创建匿名子类时需要显式类型(这实际上与它是构造函数无关)?问题是您没有参数化
新的Foo(3)调用,如果使用菱形,Java编译器将推断类型。
template<typename T>
class a_smart_ptr
{
    template<typename TOther>
    a_smart_ptr(TOther* p) { }
};