具有泛型的Java接口是否可以强制使用泛型类型?

时间:2020-10-09 18:53:13

标签: java generics interface

考虑此示例

    public interface Equatable<T> {
        public boolean equal(T t1, T t2);
    }

    public class Square implements Equatable<Square> {
        public boolean equal(Square t1, Square t2) {
            return false;
        }
    }

Equatable接口是否有可能强制Square来实现一个相等的函数,该函数接受两个Square,而不仅仅是两个任意的Square(两个String等)?

2 个答案:

答案 0 :(得分:1)

是的,您没有在界面中定义“ T”,您只能将其限制为实现Equatable的类,因此将不允许使用 String

public interface Equatable<T extends Equatable<T>>
{ 
     //...
}

做得好:

public class Square implements Equatable<Square>
{
    public boolean equal(Square t1, Square t2)
    {
        return false;
    }
}

编译错误:

public class Circle implements Equatable<String>
{
    public boolean equal(String t1, String t2)
    {
        return false;
    }
}

注意
请注意,将相同的Type名称放在方括号中是您的责任,因为下面的情况不会被编译器覆盖。
我想您想禁止对其他类型使用 等于 方法。

public class Square implements Equatable<Circle>
{
    public boolean equal(Circle t1, Circle t2)
    {
        return false;
    }
}

答案 1 :(得分:0)

您可以在某种程度上使用递归泛型类型来强制执行此操作。

public interface Equatable<T extends Equatable<T>> {
    public boolean equal(T t1, T t2);
}

相关:Java Enum definition