这是我的情景 我有3节课。
class Animal {
public getWeight(){ ..... }
public getHeight(){ ..... }
}
class Dog extends Animal {
public getDogType() { ...}
}
class Cat extends Animal {
public getCatType(){....}
}
还有一种不同的方法可以返回一个将Object作为参数
的Animal类型public Animal translate(CustomObject o){
... so many calculations here
}
这里translate方法返回Animal Object,但我需要使用相同的方法返回Dog和Cat类型而不进行类型转换。我知道我必须在这里使用Generics但是如何编辑translate方法以支持Generics,这样我就可以将Class类型传递给它的参数,如果使用Cat参数调用它返回Cat对象,如果使用Animal参数和Dog调用它则返回Animal对象如果使用Dog参数调用对象。
例如: - Cat newCat = translate(object, Cat.class); //should return cat object and not animal obj
而不是
Cat newCat =(Cat)translate(object,Cat.class)
感谢。
答案 0 :(得分:2)
您需要自我引用界限:
class Animal<T extends Animal<T>> {
public getWeight(){ ..... }
public getHeight(){ ..... }
public T translate(CustomObject o){
//... so many calculations here
}
}
class Dog extends Animal<Dog> {
//
}
class Cat extends Animal<Cat> {
//
}
您可以考虑使translate()
抽象,允许子类处理自己的实现。
答案 1 :(得分:1)
尝试public <T extends Animal> translate(CustomObject o, Class<T> clazz)
。