是否有一种语法或解决方法来将泛型类型参数限制为任何一种类型的类型?
我知道您可以将类型限制为所有类型的所有类型(即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的外部系统,但另一个系统可以给我各种类的实例,而是一个狭义的和已知的品种.
有人对“不纯”的例子发表了评论.那么一个解决方法是使用工厂方法根据传入对象的类来选择我的具体类,但是该工厂方法必须使用instanceof,所以你只是将instanceof移动到另一个地方 – 你仍然需要的instanceof.
还是这个想法不是一个好主意?
解决方法
否则,除非所有类型都具有非空联合类型,否则不会有任何意义.它们都是实现的接口,或者它们都被扩展的基类,在这种情况下,你只需指定联合类型.