Java: Generics in interface and factory -


i have base class plant there 2 subtype paths. fruit extends plant , vegetable extends plant. fruit , vegetable abstract classes , further have other classes banana extends fruit , spinach extends vegetable.

now lets example, operation has operation via these classes , there interface operation. current design follows:

i have interface:

abstract class plant {} abstract class fruit extends plant {} class banana extends fruit {}  public interface plantweigher<t extends plant> {         public int weight(t fruit);     } 

then have:

public abstract class fruitweigher<y extends fruit> implements plantweigher<y> { } 

then further have concrete class:

public class bananaweigher extends fruitweigher<banana> {   public int weight(banana fruit);     } 

now, user understands plant, correct instance of weigher , perform operation.

so factory follows:

public class weigherfactory {        public static plantweigher<? extends plant> getinstance(plant plant){      // based on logic on plant argument, return, lets say:       return new bananaweigher();        } } 

so in user class, call following function:

plantweigher<? extends plant> instance = weigherfactory.getinstance(userplant); instance.weight(plant);  // line gives error 

could 1 please me understand wrong design here , 1 please advice solution.

thanks.

the line :

 plantweigher<? extends plant> instance = weigherfactory.getinstance(userplant); 

means, "i have weigher can weight subclass of plant, not kinds of plants". example, if factory return bananaweigher, wouldn't make sense try weight tomato this. achieve want should change factory follows:

public class weigherfactory{     public static <p extends plant> plantweigher<p> getinstance(p plant){     // should return correct weigher subttype of plant p             return ...   } } 

then calling code return like:

 plantweigher<banana> instance =weigherfactory.getinstance(banana);  instance.weigh(banana) 

now have specific plantweigher , can call specific type

or, if want able weigh kind of plant kind of plantweigher, should change latter:

 public interface plantweigher {     public int weight(plant p); } 

this ensures plantweigher can weight plan, wether makes sens or not.


Comments

Popular posts from this blog

java - UnknownEntityTypeException: Unable to locate persister (Hibernate 5.0) -

python - ValueError: empty vocabulary; perhaps the documents only contain stop words -

ubuntu - collect2: fatal error: ld terminated with signal 9 [Killed] -