首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型变量的泛型类型?

类型变量的泛型类型?
EN

Stack Overflow用户
提问于 2013-06-15 01:25:20
回答 2查看 91关注 0票数 1

如何在Java泛型中表示以下类型关系:

代码语言:javascript
复制
class MyClass<T> { }

interface MyInterface<T extends MyClass> { 
  void m1(T<Integer> argument);
  void m2(T<String> argument);
  void m3(T<?> argument);
}

没有编译器的抱怨。这有可能吗?我希望确保所有方法都接收相同的MyClass (子)类,同时不破坏类型安全。在域中,MyClass的不同子类不会有意义。我真的需要像这样列出三个泛型类型变量吗:

代码语言:javascript
复制
class MyClass<T> { }

interface MyInterface<T1 extends MyClass<Integer>, 
   T2 extends MyClass<String>, T3 extends MyClass<?>> { 
  void m1(T1 argument);
  void m2(T2 argument);
  void m3(T3 argument);
}

我觉得这篇文章读起来很糟糕,而且也没有像我希望的那样很好地表达我的意图。这个问题与我关于泛型Raw types inside of generic definition的另一个问题有关,这个问题仍然让我感到困惑。也许有人能帮上忙!谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-17 16:00:29

嗯,我意识到我得到了,因为我不能用Java表达:

代码语言:javascript
复制
class MyClass<T> { }

interface MyInterface<T extends MyClass> { 
  T<S> m1(S argument);
}

然而,我找到了一个相当奇特的解决方案。在编译之前,我使用Spoon来读写相应的源代码,而不是在每个子接口中手动升级返回类型。编译器将我的代码视为我手动重写了每个接口中的返回类型。这使我的代码与每个Maven构建上的超级界面保持同步,我不必再担心它了。

这个解决方案可能并不适合每个人,但它是我能想到的最干净的解决方案,本着DNRY的精神。

票数 0
EN

Stack Overflow用户

发布于 2013-06-15 01:38:52

我不确定这是不是一个好方法。我觉得使用下面的方法你不能“绑定”参数m1m2m3方法,相反,在调用时你可以有特权使用任何类型的参数,无论是MyClass<Integer>还是MyClass<String>

代码语言:javascript
复制
public class MyClass<T> { }

interface MyOtherClass<T extends MyClass<?>> { 
  void m1(T argument);
  void m2(T argument);
  void m3(T argument);
}

和实现者

代码语言:javascript
复制
class MyOtherClassImpl<T extends MyClass<?>> implements MyOtherClass<T> {

    @Override
    public void m1(T argument) {

    }

    @Override
    public void m2(T argument) {

    }

    @Override
    public void m3(T argument) {

    }

}

这就是你如何调用

代码语言:javascript
复制
  MyOtherClass<MyClass<?>> otc = new MyOtherClassImpl<MyClass<?>>();
  MyClass<Integer> m1 = new MyClass<Integer>();
  MyClass<String> m2 = new MyClass<String>();
  MyClass<Object> m3 = new MyClass<Object>();
  otc.m1(m1);
  otc.m2(m2);
  otc.m3(m3);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17114045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档