我想创建一个这种形式的泛型类:
class MyGenericClass<T extends Number> {}
Run Code Online (Sandbox Code Playgroud)
问题是,我想接受T为Integer或Long,但不是Double.所以只有两个可接受的声明是:
MyGenericClass<Integer> instance;
MyGenericClass<Long> instance;
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
是否存在将泛型类型参数约束到任何类型的语法或解决方法?
我知道您可以将类型约束为所有类型(即AND逻辑):
public class MyClass<T extends Comparable<T> & Serializable> { } // legal syntax
Run Code Online (Sandbox Code Playgroud)
是否有OR逻辑版本,即这样的东西:
public class MyClass<T extends Comparable<T> | Serializable> { } // illegal syntax
Run Code Online (Sandbox Code Playgroud)
如果没有支持这种语法的语法(我认为没有),是否有一种解决方法或方法是一个好的模式?
对于某些上下文,一个示例用例可能是:
/** @return true if the obj is either has the same id, or if obj is the same as id */
public <T extends MyClass | String> boolean sameAs(T obj) {
if (obj instanceof String) return this.id.equals(obj);
if (obj instanceof MyClass) return this.id.equals(((MyClass)obj).id); …Run Code Online (Sandbox Code Playgroud) 已经反复说过,除了equals()方法之外,不应该使用instanceof运算符,否则它是一个糟糕的OOP设计.
有人写道,这是一个繁重的操作,但似乎,至少java,处理得相当好(甚至比Object.toString()比较更有效).
有人可以解释,或指导我一些文章,解释为什么这是一个糟糕的设计?
考虑一下:
Class Man{
doThingsWithAnimals(List<Animal> animals){
for(Animal animal : animals){
if(animal instanceOf Fish){
eatIt(animal);
}
else if(animal instanceof Dog){
playWithIt(animal);
}
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
决定如何处理动物,取决于男人.男人的欲望也可能偶尔改变,决定吃狗,玩鱼,而动物不会改变.
如果您认为instanceof运算符不是正确的OOP设计,请告诉您如何在没有instanceof的情况下执行此操作,为什么?
谢谢.