有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在定义泛型接口时遇到问题

一段时间以来,我一直在努力定义一个通用接口,但我没能做到 实现我想要的。下面是该问题的简化示例

假设我有一个通用的消息

public class Message<T> {

    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }

}

然后我想定义一个用于传输内容的接口:

public interface Transfer<Message<T>> {

    public void send(Message message);

}

问题是编译器不接受这一点,并且总是抱怨 第二个'<;'性格,无论我尝试什么变化。 如何指定此接口,使其绑定到泛型类型(基于消息) 并且还可以访问参数化类型

我的计划是使用此界面,如下所示:

public class Carrier<Message<T>> implements Transfer<Message<T>> {

    public void send(Message message) {
        T content = message.getContent();
        print(content);
    }

    public static void print(String s) {
        System.out.println("The string equals '" + s + "'");
    }

    public static void print(Integer i) {
        System.out.println("The integer equals " + i);
    }

    public static void main(String[] args) {
        Carrier<Message<String>> stringCarrier = new Carrier<Message<String>>();
        Message<String> stringMessage = new Message<String>("test");
        stringCarrier.send(stringMessage);

        Carrier<Message<Integer>> integerCarrier = new Carrier<Message<Integer>>();
        Message<Integer> integerMessage = new Message<Integer>(123);
        integerCarrier.send(integerMessage);
    }
}

我做了一些搜索和阅读(除其他外),但我无法判断这是不可能的,还是我做错了

更新2009-01-16:删除了“Thing”而不是“Message”的原始用法(之所以使用它,是因为有了它,我就能够编译而不会在接口上出现语法错误)


共 (3) 个答案

  1. # 1 楼答案

    只需为类指定T,然后使用Message<;T>;用于您的参数/返回类型

    public interface Transfer<T> {
        public void send(Message<T> message);
    }
    

    不使用消息的原因<;T>;是因为您在参数和返回类型中提供了“this is a message”上下文

  2. # 2 楼答案

    在我看来,你想要:

    public class Carrier<Thing extends Message<Foo>, Foo>
        implements Transfer<Thing>
    

    这样,编译器将知道thing是一个Message<Foo>,因此将有一个getContent()方法

    您需要将其用作:

    Carrier<Message<String>, String>
    

    但你现在有点脱节。你正在实现Transfer<Thing>,但你试图使用thing,就像它是一个Message<Thing>看看你的send方法——你用一个字符串和一个整数来调用它。这些类没有getContent()方法

    我怀疑你实际上应该实现Transfer<Message<Thing>>,而不是Transfer<Thing>

  3. # 3 楼答案

    无论您如何解决泛型问题,您的代码都不会编译,因为您没有以T类型为参数的print方法

    我相信,如果你想要你正在寻找的功能,你必须进行实例检查。所以,我认为在这种情况下,你不会从泛型类型中获得任何价值