2013-03-20 127 views
1

我希望返回类型参数是类型参数和方法参数类型参数的超类。泛型方法返回超类型的类型参数和方法参数类型参数

这编译:

import java.util.List; 
interface Foo<A> { 
    <R, B extends R> List<R> eg1(List<B> unit); 
    <R> List<R> eg2(List<? extends R> unit); 
} 

但并不强制R必须是A的超也。我怎么做?

实际上,我想要做的事喜欢在这些表示:

<B, R super A & B> List<R> func(List<B> unit); 
<B> List<? super A & B> func(List<B> unit); 

但是那些没有编制的,当然。

有两个目的,以这样的:

  1. 我希望能够将结果分配给任何超类A和B.
  2. 两者在这种方法的实现,我需要的结果类型可以包括A和B两者。所以编译的第一个例子将不起作用,因为它们不允许我在结果中放置一个A.
+1

如果允许'R'是任何超类型的'A',并且'B'被允许是'R'的任何子类型,那么这相当于只允许'B'被允许为任何东西,因为' R'始终可以是Object。你想要完成什么样的实际任务?你认为需要这些仿制药? – 2013-03-20 22:19:27

+0

@LouisWasserman我在问题中添加了详细信息以回答评论的第一部分。至于第二个......实际上,我应该先从事这方面的工作。实现这个接口导致了这个问题,我认为这回答了我的问题。 – mentics 2013-03-20 23:08:45

回答

0

由于@LouisWasserman的评论,我开始了我应该做的所以先实施思考。某处必须指定要返回的类型。要么在方法实现中进行硬编码,要么指定为类型参数,参数类型参数等。无论规范在哪里,都可以正确定义该接口方法的泛型。

换句话说,我试图做的没有意义,因为你不能构造返回类型。

+0

你应该接受你自己的答案作为你的问题的解决方案。 – 2013-03-21 00:42:44

+0

@TedHopp我必须等两天才能这样做。 – mentics 2013-03-21 04:14:50

1

我认为你必须命名在类级别类型参数:

import java.util.List; 
interface Foo<Base, A extends Base> { 
    <B extends Base> List<Base> eg1(List<B> unit); 
    <R> List<R> eg2(List<? extends R> unit); 
} 
+0

+1一个很好的折衷... – dcernahoschi 2013-03-20 22:55:33

+0

谢谢,但这不是我想要做的事。你必须指定第二个类型参数。 – mentics 2013-03-20 23:05:57