我正在创建一个 TypeToken - 类似于 Gson 的系统,我偶然发现了一些我不理解的东西。
此代码的目的是只有一个 TypeReference具有一个通用参数的类,该参数可以包含多个参数。该类将使用 inline 创建。函数,这样用户就不需要知道 Holder类。
请考虑以下代码:
package testing
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type
abstract class TypeReference<T : Holder> {
val type: Type = (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]
override fun toString(): String {
return type.typeName
}
}
inline fun <reified T : Holder> create() = object : TypeReference<T>() {}
inline fun <reified WHAT> createSingle() = object : TypeReference<Single<WHAT>>() {}
class Foo
interface Holder
interface Single<T> : Holder
fun main(args: Array<String>) {
println(create<Single<HashMap<Int, String>>>())
println(create<Single<Foo>>())
println(createSingle<HashMap<Int, String>>())
println(createSingle<Foo>())
}
这是输出:
testing.Single<java.util.HashMap<java.lang.Integer, java.lang.String>>
testing.Single<testing.Foo>
testing.Single<WHAT>
testing.Single<WHAT>
在我看来,Single<WHAT> (对不起那个通用名称)没有得到“真正”内联,并且生成了一些中间名称。
我还查看了 docs但我没有找到这方面的例子。
如何创建我最初打算做的事情?为什么会这样?
编辑:
我想提出一个问题,但他们已经知道了。
发布了一个非常相似的问题 here据说是 this 的副本.您也可以在后一个链接中投票。
供将来引用:Kotlin 1.2.50在这里使用。
最佳答案
我反编译这段代码,发现两个函数之间有些不同
private static final TypeReference create() {
Intrinsics.needClassReification(); <---- here
return (TypeReference)(new TypeReference() {
});
}
private static final TypeReference createSingle() {
return (TypeReference)(new TypeReference() {
});
}
并手动添加此代码,工作正常。不太了解这个,没有找到文档。
inline fun <reified WHAT > createSingle() = Intrinsics.needClassReification().let {
object : TypeReference<Single<WHAT>>() {}
}
结果:
Single<java.util.HashMap<java.lang.Integer, java.lang.String>>
Single<Foo>
Single<java.util.HashMap<java.lang.Integer, java.lang.String>>
Single<Foo>
关于generics - Kotlin 具体化的泛型不会按计划保持类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50850253/
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.
关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭11年前。Improvethisquestion我不经常使用ruby-通常它加起来相当于每两个月或更长时间编写一次脚本。我的大部分编程都是使用C++进行的,这与ruby有很大不同。由于我与ruby之间的差距如此之大,我总是忘记语言的基本方面(比如解析文本文件和其他简单的东西)。我想每天练习一些基本的东西,我想知道是否有一些我可以订阅的网站,并且会向我发送当天的Ruby问题或类似的东西。有人知道这样的站点/Internet服务吗?
我正在使用Rails5ApplicationController.renderer.render方法从模型中进行渲染。我需要将一些变量传递给我的布局,这是我使用locals选项完成的;如果直接访问此变量,则该变量在布局中可用,但不能通过self访问。这是我设置渲染的方式html_string=ApplicationController.renderer.render(file:"/#{template_path}/base/show",:formats=>[:pdf,:html],locals:{:@routing_form=>self,:controller_name=>contro
我正在尝试使用Vagrant创建我的第一个ChefRecipe,但在第一步就遇到了问题。我的Recipe的第一行是:include_recipe"apt"但是当我尝试vagrantprovision时,出现以下错误:==>default:[2014-09-21T07:15:42+00:00]WARN:MissingCookbookDependency:==>default:Recipe`apt`isnotintherun_list,andcookbook'apt'==>default:isnotadependencyofanycookbookintherun_list.Toloadth
我正在试用rvm,并用它安装了ruby1.9.2和rails3。我需要重新安装sqlite3-rubygem(因为rvm为不同版本的ruby将所有gem分开)。问题是,当我尝试时,我得到:geminstallsqlite3-ruby/home/jenny/.rvm/rubies/ruby-1.9.2-p0/bin/gem:4:warning:Insecureworldwritabledir/home/jenny/.rvm/gems/ruby-1.9.2-p0/bininPATH,mode040777Buildingnativeextensions.Thiscouldtakeaw
我正在尝试通过包含一个模块来覆盖动态生成的方法。在下面的示例中,Ripple关联将rows=方法添加到Table。我想调用那个方法,但之后还要做一些额外的事情。我创建了一个模块来覆盖该方法,认为该模块的row=将能够调用super以使用现有方法。classTable#Rippleassociation-createsrows=methodmany:rows,:class_name=>Table::Row#Hackyfirstattempttousethedynamically-created#methodandalsodoadditionalstuff-Iwouldactually#m
这个脚本被命名为o.rb:@logger=Logger.new(STDOUT)@logger.info"start_time:#{start_time}"当我使用./o.rb运行它时,控制台上的输出是正确的。但是,当我尝试./o.rb>log.txt2>&1时,日志文件是空的!为什么会这样?我在使用简单的puts函数时遇到了同样的问题。更新这将重现此问题:require'logger'logger=Logger.new(STDOUT)loopdologger.info"Thisisatesthaha"sleep(1)end当我使用./foo.rb运行它时,它会正确写入控制台输出。当我运