Java自动强制转换对象
我想知道是否有一种方法可以通过将类类型与对象一起存储来自动将对象强制转换为某种类型?我认为这在Java中是可能的,但也许不是 例如:Java自动强制转换对象,java,casting,Java,Casting,我想知道是否有一种方法可以通过将类类型与对象一起存储来自动将对象强制转换为某种类型?我认为这在Java中是可能的,但也许不是 例如: class StorageItem { private int itemcount; StorageItem(int itemcount) { this.itemcount = itemcount; } int getItemCount() { return itemcount;
class StorageItem
{
private int itemcount;
StorageItem(int itemcount)
{
this.itemcount = itemcount;
}
int getItemCount()
{
return itemcount;
}
}
class Storage
{
private Class clazz;
private Object value;
public Storage(Class clazz, Object value)
{
this.clazz = clazz;
this.value = value;
}
//Is there a way such a call can be created to automatically cast
//the object to the class type and return that cast type in a
//generic way. The idea being that Storage knows what it should
//already be cast to. Is this possible?
public T getValue()
{
return clazz.cast(value);
}
}
用法示例:
public static void main(String[] args)
{
//Create storage item
Storage storage = new Storage(StorageItem.class, new StorageItem(1234));
//The call to getValue() will automatically cast to the Class passed
//into Storage.
int itemcount = storage.getValue().getItemCount(); //returns 1234
}
显然,存储中的getValue()调用是一个伪代码调用,但它只是提供了我想要做什么的想法
是否有一个getValue()调用将自动强制转换到存储类中存储的类型化类。同样,这个想法是存储类知道它应该被转换为什么。还是说无论如何都可以做到这一点
StorageItem只是一个简单的例子。在这里,它只存储一个int用于讨论。然而,它可能更复杂
另一个使用示例是将存储对象存储在列表中
List<Storage> row = new ArrayList<Storage>();
row.add(new Storage(StorageItem.class, 1234));
row.add(new Storage(String.class, "Jason"));
row.add(new Storage(Integer.class, 30));
row.add(new Storage(Double.class, 12.7));
如果getValue()只返回一个对象,那么我必须始终手动强制转换到特定的对象。相反,如果我可以将强制转换类存储在存储对象中,那么存储有足够的信息来知道在getValue()调用中自动将对象强制转换为什么
如果这在Java中是可行的,这就是我所寻求的问题的答案。如果是,怎么做 这会奏效吗?所需的黑客攻击要少得多:
class Storage<T> {
private T value;
public Storage(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
类存储{
私人T值;
公共存储器(T值){
这个值=值;
}
公共T getValue(){
返回值;
}
}
我看不出您在这里试图解决的问题@bali182的答案确实为您提供了一种存储引用的“通用”方法,但存储引用本身更容易
考虑如果将两个存储
实例(包含不同类型的引用)放入一个集合中会发生什么情况:
List<Storage<SOMETHING>> storages = new ArrayList<>();
storages.add(new Storage<String>("Hello"));
storages.add(new Storage<Integer>(1));
因为您通常不知道任何给定元素的存储引用的类型。
对象
的具体类型将是元素的具体类型-字符串
和整数
,对于上面的列表-但是如果不使用某种方法来检测该类型(例如if(object instanceof String)
),就不能使用这些不同的类型
如果将引用直接存储在列表中,则会更容易:
List<Object> objects = new ArrayList<>();
storages.add("Hello");
storages.add(1;
for (Object object : objects) {
// ...
}
List objects=new ArrayList();
添加(“你好”);
增加(1;
用于(对象:对象){
// ...
}
您仍然需要做一些事情来检测对象的具体类型;您只是在没有额外的间接层的情况下进行检测
尽管上面的示例适用于不相关的类型,但如果直接引用是相同的类型,则使用直接引用更容易:
List<String> objects = Arrays.asList("Hello", "World");
for (String object : objects) {
// ...
}
List objects=Arrays.asList(“你好”,“世界”);
用于(字符串对象:对象){
// ...
}
现在,您不需要做任何事情来了解具体类型(如果元素是非final类,并且您希望专门处理一些子类,那么您可以这样做),但是您仍然避免了需要取消引用
Storage.getValue()
获取您可以直接获得的值。为什么不使用简单的泛型类?为什么Storage Storage=new Storage(StorageItem.class,new StorageItem(1234));
而不是StorageItem StorageItem=new StorageItem(1234);
更改类存储{…
和私有对象值
到类存储{…
resp.private T value;
您都已经设置好了。如果可以为我自动执行,我希望避免直接强制转换对象类型。因为存储也知道它应该强制转换自己的类,所以我不确定是否可以编写一个方法来自动强制转换到传递到存储对象中的类。请参阅我最近的更新上面的日期。您在此处要求执行的操作无法完成:编译器无法知道行。get(0)
是一个“StorageItem
-轴承”Storage
,而不是“字符串
-轴承”存储
。不仅所需的黑客攻击要少得多,它还适用于泛型类型,如不存在非原始类实例的列表
。“因为您通常不知道任何给定元素的存储引用的类型。对象的具体类型将是元素的具体类型”。没错,除非存储知道要将其转换到哪个具体类型。您可以看到我传入了具体类型。因此,存储现在知道要将其转换到哪个具体类型。请参阅我最近发布的更新。我可能想做的可能不可能。但是,这就是我为什么要问的原因,因为我不知道是否有办法。=)@JasonF编译器不知道存储对象的类型,但存储对象知道自己的类型,您可以使用getClass()
检索它。请记住,强制转换不会创建新对象-它只是对编译器说“您认为这是一个对象
,但相信我,我知道它是一个字符串
”。换句话说,object==(String)object
是true
,假设object.getClass()==String.class
@AndyT,顺便说一句,感谢您在这方面的输入。对,强制转换不会创建新对象。唯一的方法是getItemCount()如果对象被理解为StorageItem类型,则将是可调用的。您可以看到我如何使用上面的getValue调用。如果getValue可以自动转换为StorageItem,则getItemCount()将是可调用的。在Java中,我不知道如何完成或是否可以完成。如果可以通过某种方式完成,那么如何完成?如果不能,为什么?“如果没有,那么为什么?”因为Java的类型系统就是这样工作的。好吧,那么你是说存储中的getValue()无法写入,它将自动将对象强制转换为存储所存储的类类型。如果不能这样做,就不能这样做。这就是为什么我要问=)
List<Object> objects = new ArrayList<>();
storages.add("Hello");
storages.add(1;
for (Object object : objects) {
// ...
}
List<String> objects = Arrays.asList("Hello", "World");
for (String object : objects) {
// ...
}