This week's book giveaways are in the Jython/Python and Object-Oriented programming forums.
We're giving away four copies each of Machine Learning for Business: Using Amazon SageMaker and Jupyter and Object Design Style Guide and have the authors on-line!
See this thread and this one for details.
Win a copy of Machine Learning for Business: Using Amazon SageMaker and JupyterE this week in the Jython/Python forum
or Object Design Style Guide in the Object-Oriented programming forum!
  • Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Bear Bibeault
  • Paul Clapham
  • Jeanne Boyarsky
  • Knute Snortum
Sheriffs:
  • Liutauras Vilda
  • Tim Cooke
  • Junilu Lacar
Saloon Keepers:
  • Ron McLeod
  • Stephan van Hulst
  • Tim Moores
  • Tim Holloway
  • Carey Brown
Bartenders:
  • Joe Ess
  • salvin francis
  • fred rosenberger

Problem with objects casting

 
Ranch Hand
Posts: 30
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

How to realize something like this:
 
Bartender
Posts: 6109
6
Android IntelliJ IDE Java
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

Robert Raps wrote:Problem in pseudocode:
Animal - abstract class
Cat extends Animal
Dog extends Animal


Class pseudoCat = Class.forName("Cat");
Object cc=c.newInstance();

1)How can i cast cc to pseudoCat using something like getClass (not explicitly point to )
2) Is List<Cat> takes object of class pseudoCat??



There is no such class as pseudoCat. You've just retrieved that Class object that has the metadata for the Cat class, and placed a reference to that object into a variable named pseudoCat. It's no different than assigning a variable of any other reference type, such as String, Date, or JPanel.
 
Robert Raps
Ranch Hand
Posts: 30
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

Jeff Verdegan wrote:

Robert Raps wrote:Problem in pseudocode:
Animal - abstract class
Cat extends Animal

Dog extends Animal


Class pseudoCat = Class.forName("Cat");
Object cc=c.newInstance();

1)How can i cast cc to pseudoCat using something like getClass (not explicitly point to )
2) Is List<Cat> takes object of class pseudoCat??



There is no such class as pseudoCat. You've just retrieved that Class object that has the metadata for the Cat class, and placed a reference to that object into a variable named pseudoCat. It's no different than assigning a variable of any other reference type, such as String, Date, or JPanel.


I need take from Class.forName("Cat") class Cat in order to create objects of Class Cat. Something like this:
Class pseudoCat = Class.forName("Cat");
Object cc=pseudoCat.newInstance();
// cc must be instace of Cat!!
List<Cat> list = new ArraList<Cat>();
list.add(cc);

 
Jeff Verdegan
Bartender
Posts: 6109
6
Android IntelliJ IDE Java
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

Robert Raps wrote:
Class pseudoCat = Class.forName("Cat");
Object cc=pseudoCat.newInstance();




 
Robert Raps
Ranch Hand
Posts: 30
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

Jeff Verdegan wrote:

Robert Raps wrote:
Class pseudoCat = Class.forName("Cat");
Object cc=pseudoCat.newInstance();





It is clue, i can't to cast object in this way.
Explain, I want something like this:
String c="cat"
String b="dog"
List<Animal> list=new ArrayList<Animal>;
list.add(new Dog());
list.add(new Cat());

for(Animal entry:list){
i=i+1;
if (i==0){
c obj=(c) entry;
}
else
if (i==1){
b obj=(b) entry;
}
}
 
Marshal
Posts: 24961
61
Eclipse IDE Firefox Browser MySQL Database
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Instead of



you can try



Otherwise, no, you can only declare a variable to have a type known at compile time. What's your use case for this requirement you say you have?
 
Jeff Verdegan
Bartender
Posts: 6109
6
Android IntelliJ IDE Java
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator


if (i==0){
c obj=(c) entry;
}
else
if (i==1){
b obj=(b) entry;
}




You shouldn't do that. If you're putting them into List<Animal>, then you should be treating them all as Animals, and only calling Animal methods on them. You shouldn't need to cast them.

You almost certainly have a design flaw, but it's impossible to say for sure with a toy example like this.
 
Robert Raps
Ranch Hand
Posts: 30
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

Paul Clapham wrote:Instead of



you can try



Otherwise, no, you can only declare a variable to have a type known at compile time. What's your use case for this requirement you say you have?


My task in school -to write own version Serialization . I meet with problems. I write datas to file something in style of XML. Then i write datas and try to create object of Class which i have read. I don't know what type of object it will be. So, i want to create object in such way

Class<?> theClass = Class.forName(theType);
theType obj = theClass.newInstance;

I try to make this another way:
List<T>=new ArrayList<T extends Animal>;
so when i read my data, i want create object founded class (they all are sub of Animal)
But i don't want to use branch for deciding (if string="cat" then Cat b=new Cat(); list.add(b)) and so on.

I want to
String s=curClass;// it may be Cat, Dog, Pony...
And then:
S object=new S();


 
Robert Raps
Ranch Hand
Posts: 30
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

Jeff Verdegan wrote:


if (i==0){
c obj=(c) entry;
}
else
if (i==1){
b obj=(b) entry;
}




You shouldn't do that. If you're putting them into List<Animal>, then you should be treating them all as Animals, and only calling Animal methods on them. You shouldn't need to cast them.

You almost certainly have a design flaw, but it's impossible to say for sure with a toy example like this.


My task in school -to write own version Serialization . I meet with problems. I write datas to file something in style of XML. Then i write datas and try to create object of Class which i have read. I don't know what type of object it will be. So, i want to create object in such way

Class<?> theClass = Class.forName(theType);
theType obj = theClass.newInstance;

I try to make this another way:
List<T>=new ArrayList<T extends Animal>;
so when i read my data, i want create object founded class (they all are sub of Animal)
But i don't want to use branch for deciding (if string="cat" then Cat b=new Cat(); list.add(b)) and so on.

I want to
String s=curClass;// it may be Cat, Dog, Pony...
And then:
S object=new S();
 
Paul Clapham
Marshal
Posts: 24961
61
Eclipse IDE Firefox Browser MySQL Database
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
There aren't many problems with creating those objects. You've already found the relevant reflection methods. However your examples all involve assigning those objects to variables of an unknown type. This is where you seem to be stuck.

But fortunately, serialization doesn't have any such requirements. So perhaps you can explain why your version of serialization seems to have that requirement? Where did that come from?
 
Greenhorn
Posts: 3
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
as I understand you have a super class such as Animals and sub classes cat and dogs
then you have a list of Animals type which can holds cat and dogs and you need to distinguish between them to take an action
based on the object type in the Animal list

if this is what you want you can use the keyword instanceof


 
Jeff Verdegan
Bartender
Posts: 6109
6
Android IntelliJ IDE Java
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

Husam Alsulimani wrote:
if this is what you want you can use the keyword instanceof



We can, but we probably shouldn't.

Also, in your example, there's no need for instanceof or casting. It could just be written as.


As Paul has already pointed out, there should be no reason for a serialization tool to need to know anything about the types it's processing (other than possibly that they implement Serializable or some other interface). If there's code that's looking at specific classes, it's almost certainly a design flaw.
 
Husam Alsulimani
Greenhorn
Posts: 3
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
well Thanks jeff

I did a quick search and found that strategy pattern is the solution to the case i had in mind

you are right we should not use instanceof

thanks again
 
Robert Raps
Ranch Hand
Posts: 30
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

Paul Clapham wrote:There aren't many problems with creating those objects. You've already found the relevant reflection methods. However your examples all involve assigning those objects to variables of an unknown type. This is where you seem to be stuck.

But fortunately, serialization doesn't have any such requirements. So perhaps you can explain why your version of serialization seems to have that requirement? Where did that come from?


How can i make Array founded type in order to look through him and print results??
Iterator itr = curMap.entrySet().iterator();
while (itr.hasNext()) {
Map.Entry<String, Object> entry = (Map.Entry<String, Object>) itr.next();
if (entry.getValue().getClass().isArray()){

}
 
Robert Raps
Ranch Hand
Posts: 30
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

Jeff Verdegan wrote:

Husam Alsulimani wrote:
if this is what you want you can use the keyword instanceof



We can, but we probably shouldn't.

Also, in your example, there's no need for instanceof or casting. It could just be written as.


As Paul has already pointed out, there should be no reason for a serialization tool to need to know anything about the types it's processing (other than possibly that they implement Serializable or some other interface). If there's code that's looking at specific classes, it's almost certainly a design flaw.


How can i make Array founded type in order to look through him and print results??
Iterator itr = curMap.entrySet().iterator();
while (itr.hasNext()) {
Map.Entry<String, Object> entry = (Map.Entry<String, Object>) itr.next();
if (entry.getValue().getClass().isArray()){

}
 
Self destruct mode activated. Instructions for deactivation encoded in this tiny ad.
Java file APIs (DOC, XLS, PDF, and many more)
https://products.aspose.com/total/java
  • Post Reply Bookmark Topic Watch Topic
  • New Topic
Boost this thread!