是否有语法或变通方法将泛型类型参数限制为一系列类型中的任何?
我知道您可以将类型限制为一系列类型的所有(即AND
逻辑):
public class MyClass<T extends Comparable<T> & Serializable> { } // legal syntax
是否有OR
逻辑版本,即像这样:
public class MyClass<T extends Comparable<T> | Serializable> { } // illegal syntax
如果没有支持此的语法(我认为没有),是否有一种好的模式的解决方法或方法?
对于某些上下文,一个示例用例可能是:
/** @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);
return false;
}
人们似乎对我上面的方法示例的确切语义很感兴趣。让我们试试这个:
public class MyWrapper<T extends A | B> {
// my class can wrap A or B (unrelated classes). Yes I will probably use instanceof
}
已编辑:
我不知道在编译时我可能会得到什么(来自外部代码),所以我想避免为每种类型都有具体的类。此外,我必须将我的类提供给调用我的 class.method 的外部系统,但另一个系统可以给我各种类的实例,但是狭义定义和已知的种类。 p>
有些人评论说 instanceof
是“不纯的”。好吧,一种解决方法是使用工厂方法根据传入对象的类来选择我的具体类,但是该工厂方法必须使用 instanceof
,所以您只需移动 instanceof
到另一个地方 - 你仍然需要 instanceof
。
或者这个想法从来都不是一个好主意?
最佳答案
没有。除非所有类型都具有非空联合类型,否则它没有任何意义,例如它们都实现了一个接口(interface),或者它们都扩展了一个基类,在这种情况下,您只需指定联合类型。
关于绑定(bind)到任何类型范围的 Java 泛型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6592832/