绑定(bind)到任何类型范围的 Java 泛型参数

标签 java generics polymorphism

是否有语法或变通方法将泛型类型参数限制为一系列类型中的任何

我知道您可以将类型限制为一系列类型的所有(即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/

相关文章:

java - 在 ScrollView 中显示图像

java - <T extends SomeClass> 未返回 T 类型的对象。找不到适合我的解决方案

c# - 使用泛型的新手多态性问题

java在抽象方法中返回抽象类

java - 字节/整数转换

java - 从调用方法传递可变数量的参数

Java 8 泛型与通配符的问题

performance - TDictionary<TObject, TObject> 的默认 IEqualityComparer?

c++ - C++ 中的多态性,带有基类和 reference_wrapper 的 vector

c++ - 为什么继承顺序或映射会影响 vftable 的下标? (适用于 C++ 的 VSC)