Questions tagged «type-inference»

类型推断是使用类型系统定义的规则自动推断程序类型的过程。

30
在C#中使用var关键字
已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 与同事讨论了在C#3中使用'var'关键字后,我想知道人们对于通过var进行类型推断的适当用法有何看法? 例如,我宁愿在可疑的情况下懒惰地使用var,例如: foreach(var item in someList) { // ... } // Type of 'item' not clear. var something = someObject.SomeProperty; // Type of 'something' not clear. var something = someMethod(); // Type of 'something' not clear. var的更多合法用法如下: var l = new List<string>(); // Obvious what l will be. var …
406 c#  type-inference  var 

3
Collections.emptyList()返回List <Object>?
我在浏览Java推断通用类型参数的规则时遇到了一些麻烦。考虑以下类,该类具有可选的list参数: import java.util.Collections; import java.util.List; public class Person { private String name; private List&lt;String&gt; nicknames; public Person(String name) { this(name,Collections.emptyList()); } public Person(String name,List&lt;String&gt; nicknames) { this.name = name; this.nicknames = nicknames; } } 我的Java编译器给出以下错误: Person.java:9: The constructor Person(String, List&lt;Object&gt;) is undefined 但是Collections.emptyList()返回类型&lt;T&gt; List&lt;T&gt;,不是List&lt;Object&gt;。添加演员表无济于事 public Person(String name) { this(name,(List&lt;String&gt;)Collections.emptyList()); } …


14
C ++ 11 auto关键字多少钱?
我一直在使用autoC ++ 11标准中的new 关键字来处理复杂的模板化类型,这是我认为它的设计目的。但是我还将它用于诸如以下的事情: auto foo = std::make_shared&lt;Foo&gt;(); 更怀疑的是: auto foo = bla(); // where bla() return a shared_ptr&lt;Foo&gt; 关于这个主题,我还没有看到太多讨论。auto由于类型通常是文档和健全性检查的一种形式,因此似乎可以过度使用。您在哪里划界线auto?此新功能的建议用例是什么? 需要澄清的是:我不是在征求哲学意见;我要求标准委员会提供此关键字的预期用途,并可能对在实践中如何实现预期用途提出意见。 旁注:此问题移至SE.Programmers,然后返回到堆栈溢出。关于这个的讨论可以在这个元问题中找到。

22
为什么Swift编译时间这么慢?
我正在使用Xcode 6 Beta 6。 这已经困扰了我一段时间,但是现在已经到了几乎无法使用的地步。 我的项目已经开始有一个体面的65个斯威夫特文件的大小和几个桥接Objective-C的文件(这是真的不是问题的原因)。 似乎对任何Swift文件进行任何微小的修改(例如在应用中几乎没有使用的类中添加简单的空白)都会导致重新编译指定目标的整个Swift文件。 经过更深入的调查,我发现CompileSwiftXcode在swiftc目标的所有Swift文件上运行命令的阶段占了编译器时间的几乎100%。 我进行了进一步的研究,如果仅使用默认控制器保留应用程序委托,则编译速度非常快,但是随着我添加越来越多的项目文件,编译时间开始变得很慢。 现在只有65个源文件,每次编译大约需要8/10秒。一点也不快。 我还没有看到任何帖子谈到这个问题,除了这一个,但所以我想知道如果我在这种情况下,只有一个,这是一个旧版本的Xcode 6。 更新 我已经在GitHub上检查了一些Swift项目,例如Alamofire,Euler和CryptoSwift,但是它们都没有足够的Swift文件可以进行实际比较。我发现唯一一个启动时大小合适的项目是SwiftHN,即使它只有十几个源文件,我仍然能够验证同一件事,一个简单的空间,整个项目需要重新编译,这开始需要一个很少的时间(2/3秒)。 与分析器和编译速度都很快的Objective-C代码相比,这确实让Swift永远无法处理大型项目,但是请告诉我我错了。 Xcode 6 Beta 7更新 仍然没有任何改善。这开始变得荒谬。由于缺少#importSwift,我真的看不到苹果将如何进行优化。 使用Xcode 6.3和Swift 1.2进行更新 苹果增加了增量构建(以及许多其他编译器优化)。您必须将代码迁移到Swift 1.2才能看到这些好处,但是Apple在Xcode 6.3中添加了一个工具来帮助您做到这一点: 然而 不要像我那样高兴得太快。他们用来使构建增量的图形求解器尚未得到很好的优化。 的确,首先,它不关注函数签名的更改,因此,如果在一个方法的块中添加空格,则将重新编译所有依赖于该类的文件。 其次,它似乎基于重新编译的文件来创建树,即使更改不影响它们也是如此。例如,如果将这三个类移到不同的文件中 class FileA: NSObject { var foo:String? } class FileB: NSObject { var bar:FileA? } class FileC: NSObject { var baz:FileB? …

5
如何将类类型作为函数参数传递
我有一个通用函数,该函数调用Web服务并将JSON响应序列化回一个对象。 class func invokeService&lt;T&gt;(service: String, withParams params: Dictionary&lt;String, String&gt;, returningClass: AnyClass, completionHandler handler: ((T) -&gt; ())) { /* Construct the URL, call the service and parse the response */ } 我要完成的是等效于此Java代码 public &lt;T&gt; T invokeService(final String serviceURLSuffix, final Map&lt;String, String&gt; params, final Class&lt;T&gt; classTypeToReturn) { } 我要完成的方法签名正确吗? 更具体地说,AnyClass将参数类型指定为正确的做法是正确的吗? 调用该方法时,我将其MyObject.self作为returningClass值传递,但是出现编译错误“无法将表达式的类型'()'转换为'String'类型” CastDAO.invokeService("test", …

14
在C ++中用auto声明变量是否有缺点?
似乎auto在C ++ 11中添加了相当重要的功能,该功能似乎遵循了许多较新的语言。与Python之类的语言一样,我没有看到任何显式的变量声明(我不确定是否可以使用Python标准)。 使用auto声明变量而不是显式声明变量是否有缺点?

1
标量对推断类型的“可接受的复杂性”有什么限制?
根据Scala语言规范: ...允许使用局部类型推断来限制[类型参数]推断范围的复杂性。必须相对于可接受的复杂性类型集合来理解类型的最小和最大。 在实践中有什么限制? 另外,适用于推断表达式类型的限制与适用于参数类型界限的限制是否不同,这些限制是什么?

8
如何在设计时可靠地确定使用var声明的变量的类型?
我正在为emacs中的C#完成(智能)功能。 这个想法是,如果用户键入一个片段,然后通过特定的按键组合要求完成,则完成设施将使用.NET反射来确定可能的完成。 这样做需要知道完成的事物的类型。如果是字符串,则存在一组已知的可能方法和属性。如果是Int32,则具有单独的集合,依此类推。 使用语义,emacs中提供了一个代码lexer / parser程序包,我可以找到变量声明及其类型。鉴于此,很容易使用反射来获取类型上的方法和属性,然后向用户显示选项列表。(好吧,在 emacs中执行操作不是很简单,但是使用在 emacs 中运行powershell进程的功能会变得容易得多。我编写了一个自定义.NET程序集进行反射,将其加载到powershell中,然后在运行时在elisp中运行emacs可以通过comint将命令发送到powershell并读取响应。因此emacs可以快速获得反射结果。) 当代码用于var完成事物的声明时,问题就来了。这意味着未明确指定类型,并且补全将不起作用。 使用var关键字声明变量时,如何可靠地确定使用的实际类型?只是要清楚一点,我不需要在运行时确定它。我想在“设计时”确定它。 到目前为止,我有这些想法: 编译并调用: 提取声明语句,例如`var foo =“ a string value”;` 连接语句`foo.GetType();` 动态将生成的C#片段编译为新程序集 将程序集加载到新的AppDomain中,运行片段并获取返回类型。 卸下并丢弃组件 我知道该怎么做。但是,对于编辑器中的每个完成请求,这听起来都是非常沉重的。 我想我不需要每次都需要新的AppDomain。我可以将单个AppDomain重复用于多个临时程序集,并在多个完成请求中分摊设置和拆除它的成本。这更多是对基本概念的调整。 编译并检查IL 只需将声明编译到模块中,然后检查IL,以确定编译器推断出的实际类型。这怎么可能?我将用什么来检查IL? 还有更好的主意吗?注释?建议? 编辑 -对此进行进一步的考虑是不可接受的,因为调用可能会产生副作用。因此,必须排除第一个选项。 另外,我想我不能假设存在.NET 4.0。 更新 -上面没有提到的正确答案,但由埃里克·利珀特(Eric Lippert)轻轻指出,是实现完整的保真类型推断系统。这是在设计时可靠地确定var类型的唯一方法。但是,这也不容易做到。因为我没有幻想要尝试构建这样的东西,所以我选择了选项2的快捷方式-提取相关的声明代码,并进行编译,然后检查生成的IL。 实际上,这对于完成方案的相当一部分是有效的。 例如,假设在以下代码片段中,?是用户要求完成的位置。这有效: var x = "hello there"; x.? 完成将认识到x是一个String,并提供适当的选项。它通过生成并编译以下源代码来完成此操作: namespace N1 { static class dmriiann5he …

1
调用静态通用方法
我遇到了一个涉及静态泛型方法的奇怪情况。这是代码: class Foo&lt;E&gt; { public static &lt;E&gt; Foo&lt;E&gt; createFoo() { // ... } } class Bar&lt;E&gt; { private Foo&lt;E&gt; member; public Bar() { member = Foo.createFoo(); } } 我为什么不必在表达式中指定任何类型参数Foo.createFoo()?这是某种类型推断吗?如果要对此明确,如何指定类型参数?

5
实现类型推断
我在这里看到了一些有关静态类型与动态类型的有趣讨论。由于编译类型检查,更好的文档代码等,我通常更喜欢静态类型。但是,我同意,例如,如果采用Java的方式完成代码,它们会使代码混乱。 因此,我将开始构建自己的功能样式语言,而类型推断是我要实现的事情之一。我确实知道这是一个很大的主题,并且我不尝试创建以前没有做过的事情,只是进行基本推理... 关于如何阅读的任何指示都可以帮助我解决这个问题?最好是一些比较实用/实用的东西,而不是更多的理论范畴论/类型理论课本。如果那里有一个实施讨论文本,以及数据结构/算法,那将是很可爱的。

3
Java 8中异常类型推断的独特功能
在此站点上为另一个答案编写代码时,我遇到了这种特殊性: static void testSneaky() { final Exception e = new Exception(); sneakyThrow(e); //no problems here nonSneakyThrow(e); //ERRROR: Unhandled exception: java.lang.Exception } @SuppressWarnings("unchecked") static &lt;T extends Throwable&gt; void sneakyThrow(Throwable t) throws T { throw (T) t; } static &lt;T extends Throwable&gt; void nonSneakyThrow(T t) throws T { throw t; } 首先,我很困惑为什么sneakyThrow对编译器的调用正常。T当未提及任何未经检查的异常类型时,它推断出什么可能的类型? …

8
无法在Kotlin中“ findViewById”。出现错误“类型推断失败”
我尝试RecycleView按ID查找ID时遇到以下错误。 错误:- 类型推断失败:没有足够的信息来推断参数T 码: class FirstRecycleViewExample : AppCompatActivity() { val data = arrayListOf&lt;String&gt;() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.first_recycleview) val recycler_view = findViewById(R.id.recycler_view) as RecyclerView ///IN THIS LINE I AM GETTING THE ERROR data.add("First Data") data.add("Second Data") data.add("Third Data") data.add("Forth Data") data.add("Fifth Data") //creating our adapter val adapter = …

4
为什么此Haskell代码会产生“无限类型”错误?
我是Haskell的新手,并且遇到了我无法理解的“无法构造无限类型”错误。 实际上,除此之外,我什至无法找到一个很好的解释该错误的含义,因此,如果您可以超越我的基本问题并解释“无限类型”错误,我将不胜感激。 这是代码: intersperse :: a -&gt; [[a]] -&gt; [a] -- intersperse '*' ["foo","bar","baz","quux"] -- should produce the following: -- "foo*bar*baz*quux" -- intersperse -99 [ [1,2,3],[4,5,6],[7,8,9]] -- should produce the following: -- [1,2,3,-99,4,5,6,-99,7,8,9] intersperse _ [] = [] intersperse _ [x] = x intersperse s (x:y:xs) = x:s:y:intersperse s xs …

3
为什么此Java 8程序无法编译?
该程序可以在Java 7(或带有的Java 8 -source 7)中很好地编译,但是不能与Java 8一起编译: interface Iface&lt;T&gt; {} class Impl implements Iface&lt;Impl&gt; {} class Acceptor&lt;T extends Iface&lt;T&gt;&gt; { public Acceptor(T obj) {} } public class Main { public static void main(String[] args) { Acceptor&lt;?&gt; acceptor = new Acceptor&lt;&gt;(new Impl()); } } 结果: Main.java:10: error: incompatible types: cannot infer type …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.