Java泛型参数绑定到任何类型的任何一种

Boh*_*ian 14 java generics polymorphism

是否存在将泛型类型参数约束到任何类型的语法或解决方法?

我知道您可以将类型约束为所有类型(即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);
    return false;
}
Run Code Online (Sandbox Code Playgroud)

人们似乎对我上面的方法示例的确切语义感到困惑.让我们试试这个:

public class MyWrapper<T extends A | B> {
    // my class can wrap A or B (unrelated classes). Yes I will probably use instanceof
}
Run Code Online (Sandbox Code Playgroud)

编辑:
我不会在编译时知道我可能会得到(来自外部代码),所以我想避免为每种类型都有具体的类.另外,我必须把我的课程交给一个调用我的class.method的外国系统,但是另一个系统可以给我一些各种类的实例,但是一个狭义的和已知的变种.

有些人评论说instanceof"不纯".好吧,一个解决方法是使用工厂方法根据传入对象的类选择我的具体类,但该工厂方法必须使用instanceof,所以你只是移动instanceof到另一个地方 - 你仍然需要instanceof.

或者这个想法不是一个好主意吗?

Joo*_*kka 6

public class MyWrapper<T extends A | B> {}
Run Code Online (Sandbox Code Playgroud)

您不能对无法控制的接口执行此操作,但对于您自己的东西,您可以使用空标记接口:

interface AOrB {
}

interface A extends AOrB {
    someMethodHere();
}

interface B extends AOrB {
    someOtherMethodHere();
}

public class MyClass<T extends AOrB> {}
Run Code Online (Sandbox Code Playgroud)

无论纯粹主义者说什么,instanceof当你需要它时,使用是完全正常的.


use*_*421 5

没有.除非所有类型都具有非空的联合类型,例如它们全部实现的接口,或者它们都扩展的基类,否则没有任何意义,在这种情况下,您只需指定联合类型.