1

尽管此问题中的示例使用 Visual Basic.NET 和 Java,但该主题也可能适用于实现类型推断的其他语言。

到目前为止,我只在 VB.NET 中使用 LINQ 时使用过类型推断。但是,我知道类型推断可以用于语言的其他部分,如下所示:

Dim i = 1    'i is inferred to be an Integer
Dim s = "Hoi"    's is inferred to be a string

Dim Temperatures(10) as Double

For T In Temperatures      'T is inferred to be a Double
    'Do something
Next

我可以看到类型推断如何减少我需要编写一段代码的输入量,并且还可以更快地更改基本变量的类型(例如Temperatures(10)上面),因为您不需要更改类型访问它的所有其他变量(例如T)。但是,我担心缺少明确的类型声明可能会使代码更难阅读,比如在代码检查期间,因为变量的类型可能不是很明显。例如,通过仅查看上面的 For 循环,您可能会正确地假设它T是某个浮点值,但如果不回头查看Temperatures. 根据代码的编写方式,Temperatures可以更早地声明,因此需要读者返回并找到声明,然后继续阅读。诚然,当使用一个好的 IDE 时,这并不是什么大问题,因为将鼠标光标快速悬停在变量名称上会显示类型。

另外,我想在某些情况下使用类型推断可能会在尝试更改代码时引入一些错误。考虑下面的(诚然做作的)示例,假设类AB做完全不同的事情。

Class A
    Public Sub DoSomething()
    End Sub
End Class

Class B
    Public Sub DoSomething()
    End Sub
End Class

Dim ObjectList(10) As A

For item In ObjectList
    item.DoSomething()
End For

可以更改ObjectListfrom Ato的类型,B代码可以编译,但功能不同,这可能表现为代码其他部分的错误。

通过一些类型推断的例子,我想大多数人都会同意它的使用对可读性或可维护性没有负面影响。例如,在 Java 7 中,可以使用以下内容:

ArrayList<String> a = new ArrayList<>();    // The constructor type is inferred from the declaration.

代替

ArrayList<String> a = new ArrayList<String>();

我很想知道人们对这个问题的想法是什么,以及是否有任何关于应该如何广泛使用类型推断的建议。

阿米尔

4

3 回答 3

3

就我个人而言,我倾向于仅在类型清晰且使代码更易于阅读的情况下使用隐式类型推断

var dict = new Dictionary<string, List<TreeNode<int>>>();

比阅读更容易

Dictionary<string, List<TreeNode<int>>> dict =
    new Dictionary<string, List<TreeNode<int>>>();

但类型是明确的。


在这里,您得到的并不是很清楚,我会明确指定类型:

var something = GetSomeThing();

在这里使用没有意义,var因为它不会简化任何事情

int i = 0;
double x = 0.0;
string s = "hello";
于 2012-04-15T22:20:47.977 回答
1

我认为部分是编码风格的问题。我个人选择了更详细的代码。(虽然当我转向 Java 7 项目时,我可能会利用新语法,因为所有内容都在一行中。)

我也认为明确可以避免某些微妙的错误。举个例子:

For T In Temperatures      'T is inferred to be a Double
    'Do something
Next

如果Do something是一种依赖于 的数值方法TDouble那么更改Temperatures为单精度可能会导致算法无法收敛,或者收敛到不正确的值。

我想我可以用另一种方式争论——明确变量类型在某些情况下会产生很多本来可以避免的微不足道的维护工作。同样,我认为这完全是风格问题。

于 2012-04-15T21:11:30.200 回答
-2

泛型的使用是为了确保在编译时进行类型安全检查,而不是在运行时进行处理。如果您正确使用类型安全,它将使您免于运行时异常以及在数据检索时编写转换代码。

JAva 在 jdk 1.7 之前不使用这个语法

ArrayList<String> a = new ArrayList<>(); 

它的

ArrayList<String> a = new ArrayList(); 

但是在java中使用

ArrayList<String> a = new ArrayList(); and
ArrayList<String> a = new ArrayList<String>();

两者都认为相同,因为引用变量包含安全类型的编译时间信息,它是字符串,您不能在其中添加任何其他内容而不是字符串,即

a.add(new Integer(5));

它仍然是类型安全的,你会得到只能插入字符串的错误。

所以你不能做你期望做的事情。

于 2012-04-15T21:00:13.723 回答