【发布时间】:2011-07-06 07:17:01
【问题描述】:
是否有将泛型类型参数限制为任何类型范围的语法或解决方法?
我知道您可以将一个类型限制为 all 的一系列类型(即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 移动到另一个地方 -你仍然需要instanceof。
或者这个想法从来都不是一个好的想法?
【问题讨论】:
-
提供两个重载的sameAs实现不是更好吗?
-
OR 语法没有意义。当您指定一个通用约束时,它是一个合同,它不能是任何一个或类型。在您的示例中,如果您要使用
instanceof,obj也可能不是通用的;就让它Object obj。
标签: java generics polymorphism