假设我们有一个接受枚举值的方法.在此方法检查该值是否有效之后,它将switch覆盖可能的值.所以问题是,在验证了值范围后,处理意外值的首选方法是什么?
例如:
enum Mood { Happy, Sad }
public void PrintMood(Mood mood)
{
if (!Enum.IsDefined(typeof(Mood), mood))
{
throw new ArgumentOutOfRangeException("mood");
}
switch (mood)
{
case Happy: Console.WriteLine("I am happy"); break;
case Sad: Console.WriteLine("I am sad"); break;
default: // what should we do here?
}
Run Code Online (Sandbox Code Playgroud)
处理default案件的首选方法是什么?
// can never happenDebug.Fail()(或Debug.Assert(false))throw new NotImplementedException() (或任何其他例外)是否可以在Java中指定类型参数的上限和下限约束?
我在Sun的论坛中发现了一个对话,其中讨论了这个问题(显然在仿制药功能最终确定之前),但没有最终答案.
总之,是否有一个有效的语法来执行此操作:
public class MyClass<T extends Number super Integer>
Run Code Online (Sandbox Code Playgroud)
?
Java中是否有一种方法可以声明其值可以一起使用的枚举?例如:
enum FileAccess { Read, Write, ReadWrite }
Run Code Online (Sandbox Code Playgroud)
是否可以将ReadWrite定义为Read | Write(或产生相同结果的任何东西)?
如果我问一些愚蠢的东西,我很抱歉,但我完全是C#和ASP.NET的新手.我的代码中有错误,我不明白.我正在使用Visual Studio 2008.
在这行代码中:
public class SQLFAQProvider : DBFAQProvider
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Moby.Commerce.DataAccess.FAQ.SQLFAQProvider不实现继承的抽象成员Moby.Commerce.DataAccess.FAQDBFAQProvider.DeleteFAQbyID(int)
当我转到DBFAQProvider错误是在这行代码中:
public abstract DBFAQ DeleteFAQbyID(int fAQID);
Run Code Online (Sandbox Code Playgroud)
我该怎么改变来纠正它?
请查看以下代码.
trait MyTrait { val myVal : String }
class MyClass extends MyTrait { val myVal = "Value" }
class MyClass2(val myVal: String) extends MyTrait
Run Code Online (Sandbox Code Playgroud)
为什么初始化顺序在MyClass和MyClass2?的情况下有所不同?构造函数MyClass将为
MyClass() {
MyTrait$class.$init$(this);
myVal = value
}
Run Code Online (Sandbox Code Playgroud)
构造函数MyClass2将是
MyClass2(String myVal) { this.myVal = myVal; MyTrait$class.$init$(this) }
Run Code Online (Sandbox Code Playgroud)
我认为初始化顺序应该像MyClass2构造函数那样,两种情况都是一样的.
编程C++时,我们习惯于在需要时创建复制构造函数(或者我们被教导).几年前切换到Java时,我注意到现在正在使用Cloneable接口.C#遵循定义ICloneable接口的相同路由.在我看来,克隆是OOP定义的一部分.但我想知道,为什么创建这些接口,并且复制构造函数似乎已被删除?
当我想到它时,我开始认为如果需要复制一个类型未知的对象(如对基类型的引用),则复制构造函数将没有用处.这看似合乎逻辑.但我想知道是否还有其他原因我不知道,Cloneable接口是否比拷贝构造器更受青睐?
Java 5引入了泛型,它们被添加到java.lang包中的许多接口中.但是,Cloneable没有得到泛型.我想知道为什么?
编辑:回答@Jon和@litb的答案,以及@Earwicker的评论,我想的Cloneable可能是:
public interface Cloneable<T> {
public T clone();
}
Run Code Online (Sandbox Code Playgroud)
这里T clone();覆盖Object.clone(),给它一个协变类型.我相信这仍然会向后兼容并提高类型安全性.那为什么不呢?
编辑2:从下面的答案(和评论)中可以看出,上面建议的界面会破坏向后兼容性.由于Object.clone()IS protected,在接口重写它会迫使所有的实施者提供了一个public实现,类的设计者可能不希望(即它们可能会选择保留它protected).
文档System.Threading.Timer说我应该为它保留一个实时参考,以避免它被垃圾收集.但是我应该在哪里这样做?我main很简单,我不知道在哪里保留参考:
class Program {
static void Main() {
new System.Threading.Thread(myThreadStart).Start();
new System.Threading.Timer(myTimerCallback, new MyStateObject(), 0, 5000);
}
}
Run Code Online (Sandbox Code Playgroud)
我想过保持在参考static该领域Program类,假设static领域没有得到收集,直到应用程序结束.但我不确定这是最好的方法,所以我很感激你的建议.
有没有一种方法/工具可以显示我在项目中实现某个界面的所有类/接口?在Eclipse(Java)中,我将使用上下文菜单"Open Type Hierarchy"选项,它将显示一个(漂亮)类型的树,它扩展了所选类型.是否有工具在.NET中执行相同的操作?
我正在创建一个需要使用大量RAM的.NET应用程序(C#).我最近知道在32位版本的Windows XP上我只能使用2 GB,除非我使用/3Gb交换机,并IMAGE_FILE_LARGE_ADDRESS_AWARE在可执行标头中设置标志.但是因为我正在开发.NET应用程序,我想我无法直接修改可执行文件,是吗?那么,我该怎么做才能让我的应用程序使用3 GB?