public class Animal {
public void eat() {}
}
public class Dog extends Animal {
public void eat() {}
public void main(String[] args) {
Animal animal = new Animal();
Dog dog = (Dog) animal;
}
}
Run Code Online (Sandbox Code Playgroud)
赋值Dog dog = (Dog) animal;不会生成编译错误,但在运行时会生成一个ClassCastException.为什么编译器无法检测到此错误?
我的价格是int6位数.我希望将它显示为String带有小数点(.)的结尾处的2位数int.我想使用a float但建议String用于更好的显示输出(而不是1234.5将1234.50).因此,我需要一个函数,它将采用intas参数并返回正确格式化String的结尾,小数点为2位数.
说:
int j= 123456
Integer.toString(j);
//processing...
//output : 1234.56
Run Code Online (Sandbox Code Playgroud) 这可能是一个新手的问题,但谷歌出人意料地没有提供答案.
我有这种相当人为的方法
T HowToCast<T>(T t)
{
if (typeof(T) == typeof(string))
{
T newT1 = "some text";
T newT2 = (string)t;
}
return t;
}
Run Code Online (Sandbox Code Playgroud)
来自C++背景我希望这可以工作.但是,无法编译"无法将类型'T'隐式转换为字符串"和"无法将类型'T'转换为字符串"以进行上述两种分配.
我要么在概念上做错了,要么只是有错误的语法.请帮我整理一下.
谢谢!
如何将指针(Object *ob)传递给原型的函数void foo(Object &)?
我有一个类Animal及其子类Dog.我经常发现自己编写以下代码:
if (animal is Dog)
{
Dog dog = animal as Dog;
dog.Name;
...
}
Run Code Online (Sandbox Code Playgroud)
对于变量Animal animal;.
是否有一些语法允许我写如下:
if (Dog dog = animal as Dog)
{
dog.Name;
...
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
使用CLR中的'as'关键字进行转换
我最近了解了一种不同的演员方式.而不是使用
SomeClass someObject = (SomeClass) obj;
Run Code Online (Sandbox Code Playgroud)
可以使用以下语法:
SomeClass someObject = obj as SomeClass;
Run Code Online (Sandbox Code Playgroud)
如果obj不是SomeClass,它似乎返回null,而不是抛出一个类转换异常.
我看到如果转换失败并且我尝试访问someObject变量,这可能导致NullReferenceException.所以我想知道这种方法背后的理由是什么?为什么要使用这种方式而不是(旧)方式 - 它似乎只是将失败的演员问题"更深"地转移到代码中.
每次应用程序启动时,我将当前时间存储在数据库中.
Calendar c = Calendar.getInstance();
String str = c.getTime().toString();
Log.i("Current time", str);
Run Code Online (Sandbox Code Playgroud)
在数据库方面,我将当前时间存储为字符串(如上面的代码所示).因此,当我从数据库加载它时,我需要将其强制转换为Date对象.我看到了一些样本,他们都使用了"DateFormat".但我的格式与日期格式完全相同.所以,我认为没有必要使用"DateFormat".我对吗?
无论如何直接将此String转换为Date对象?我想将此存储时间与当前时间进行比较.
谢谢
======> 更新
谢谢亲爱的伙计们.我使用以下代码:
private boolean isPackageExpired(String date){
boolean isExpired=false;
Date expiredDate = stringToDate(date, "EEE MMM d HH:mm:ss zz yyyy");
if (new Date().after(expiredDate)) isExpired=true;
return isExpired;
}
private Date stringToDate(String aDate,String aFormat) {
if(aDate==null) return null;
ParsePosition pos = new ParsePosition(0);
SimpleDateFormat simpledateformat = new SimpleDateFormat(aFormat);
Date stringDate = simpledateformat.parse(aDate, pos);
return stringDate;
}
Run Code Online (Sandbox Code Playgroud) 我有一个List<SubClass>我想要作为一个List<BaseClass>.看起来它应该不是一个问题,因为将a转换SubClass为a BaseClass是一个快照,但我的编译器抱怨演员表是不可能的.
那么,获取对相同对象的引用的最佳方法是List<BaseClass>什么?
现在我只是制作一个新列表并复制旧列表:
List<BaseClass> convertedList = new ArrayList<BaseClass>(listOfSubClass)
Run Code Online (Sandbox Code Playgroud)
但据我了解,必须创建一个全新的列表.如果可能的话,我想参考原始列表!
我有以下简单的代码:
int speed1 = (int)(6.2f * 10);
float tmp = 6.2f * 10;
int speed2 = (int)tmp;
Run Code Online (Sandbox Code Playgroud)
speed1和speed2应该具有相同的值,但事实上,我有:
speed1 = 61
speed2 = 62
Run Code Online (Sandbox Code Playgroud)
我知道我应该使用Math.Round而不是cast,但我想了解为什么值不同.
我查看了生成的字节码,但除了存储和加载外,操作码是相同的.
我也在java中尝试了相同的代码,我正确地获得了62和62.
有人可以解释一下吗?
编辑: 在实际代码中,它不是直接6.2f*10而是函数调用*常量.我有以下字节码:
速度1:
IL_01b3: ldloc.s V_8
IL_01b5: callvirt instance float32 myPackage.MyClass::getSpeed()
IL_01ba: ldc.r4 10.
IL_01bf: mul
IL_01c0: conv.i4
IL_01c1: stloc.s V_9
Run Code Online (Sandbox Code Playgroud)
速度2:
IL_01c3: ldloc.s V_8
IL_01c5: callvirt instance float32 myPackage.MyClass::getSpeed()
IL_01ca: ldc.r4 10.
IL_01cf: mul
IL_01d0: stloc.s V_10
IL_01d2: ldloc.s V_10
IL_01d4: conv.i4
IL_01d5: stloc.s V_11
Run Code Online (Sandbox Code Playgroud)
我们可以看到操作数是浮点数,唯一的区别是stloc/ldloc
至于虚拟机,我尝试使用Mono/Win7,Mono/MacOS和.NET/Windows,结果相同
我有Hibernate方法,它返回一个BigDecimal.我有另一个API方法,我需要传递该数字但它接受Integer作为参数.我无法更改两种方法的返回类型或变量类型.
现在如何将BigDecimal转换为Integer并将其传递给第二个方法?
有没有办法解决这个问题?
casting ×10
c# ×4
java ×4
string ×2
.net ×1
android ×1
bigdecimal ×1
c++ ×1
date ×1
expression ×1
generics ×1
if-statement ×1
inheritance ×1
int ×1
integer ×1
pointers ×1
reference ×1