假设您有一个通用接口(interface):
public interface MyInterface<T> {
T doSomething();
}
是否可以声明一个实现 MyInterface<T> 的枚举? , 但每个枚举常量都为不同的值 T 实现它?也就是说,给定这个枚举:
public enum MyEnum {
FOO,
BAR,
BAZ;
}
我们可以改变它吗FOO工具 MyInterface<Integer> , BAR工具 MyInterface<String> , 和 BAZ工具 MyInterface<List<MyOtherType>> , 并使 MyEnum整体工具MyInterface<?> ?这样做似乎是完全可行的,所以它可能以类型安全的方式完成。
最佳答案
不,因为amalloy pointed out , Java 不允许使用类型参数声明枚举。很明显为什么如果你考虑枚举的使用方式,例如在 switch 中.
还要考虑该语言将如何实现通用枚举 - 这并非微不足道。对于通用枚举 MyEnum<T> ,每个枚举常量都需要解析 T某些特定类型,否则它们根本就不是常量。考虑一下:
enum MyEnum<T> {
FOO; // T is not resolved
}
什么是 T对于 FOO这里?该语言需要一种新的语法才能表达它,例如:
enum MyEnum<T> {
FOO<String>;
}
因此,现在我们正在增加语言的复杂性,以支持没有过于引人注目的用例的语义。很容易理解为什么语言设计者会简单地禁止枚举的类型参数。
解决方法:
您可以通过简单地不使用枚举来模拟您想要的模式。将接口(interface)的实现组织到实用程序类中:
public class MyImplementations {
public static final MyInterface<Integer> FOO =
new MyInterface<Integer>() {
...
};
public static final MyInterface<String> BAR =
new MyInterface<String>() {
...
};
public static final MyInterface<List<MyOtherType>> BAZ =
new MyInterface<List<MyOtherType>>() {
...
};
private MyImplementations() { }
}
唯一固有缺失的是迭代不同实现的方法,正如您可以使用 MyEnum.values() 完成的那样- 但假设有一个 MyEnum<T> ,您可以迭代的最具体的类型是 MyEnum<?> .
关于java - 在 Java 中实现通用接口(interface)的枚举常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13207016/
我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我需要在RubyonRails中实现无向图G=(V,E)并考虑构建一个Vertex和一个Edge模型,其中Vertex有_多条边。由于边恰好连接两个顶点,您将如何在Rails中执行此操作?您是否知道任何有助于实现此类图表的gem或库(对重新发明轮子不感兴趣;-))? 最佳答案 不知道有任何现有库在ActiveRecord之上提供图形逻辑。您可能必须实现自己的Vertex、EdgeActiveRecord支持的模型(请参阅Rails安装的rails/activerecord中的vertex.rb和edge.rb/test/fixtur
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www