2013-03-20 2 views
1

Я хочу, чтобы возвращаемый тип param был супер как param параметра, так и param параметра param.Generic method return super type type param и method Параметр параметра param

компилируется:

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 должно быть супер А также. Как мне это сделать?

В сущности, я хочу сделать что-то вроде того, что выражается в них:

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

Но те не компилировать, конечно.

Есть две цели этой:

  1. Я хочу, чтобы иметь возможность присвоить результат любого супер класса А и В.
  2. В реализации этого метода, мне нужен результат тип, который может включать как A, так и B. Поэтому первые примеры, которые компилируются, не будут работать, потому что они не позволят мне помещать A в результат.
+1

Если 'R' разрешено быть любым супертипом' A', а 'B' разрешено быть любым подтипом' R', то это эквивалентно простому утверждению, что 'B' разрешено быть чем угодно, R' всегда может быть «Object». Какую _actual task_ вы пытаетесь выполнить, что, по вашему мнению, нужны эти дженерики? –

+0

@LouisWasserman Я добавил подробности к вопросу, чтобы ответить на первую часть вашего комментария. Что касается второго ... на самом деле, я должен был сначала поработать над этим. Реализация этого интерфейса приводит к проблеме, и я думаю, что это отвечает на мой вопрос. – mentics

ответ

0

Благодаря комментарий @LouisWasserman «s, я начал думать о реализации, которую я должен был сделать так, первым , Где-то что-то должно указывать тип, который нужно построить для возврата. Либо жестко закодирован в реализации метода, задан как параметр типа, параметр param param и т. Д. И везде, где эта спецификация, вот где можно правильно определить генерики для этого метода интерфейса.

Другими словами, то, что я пытаюсь сделать, не имеет смысла, потому что вы не можете построить тип возврата.

+0

Вы должны принять свой собственный ответ в качестве решения своего вопроса. –

+0

@TedHopp Мне нужно подождать два дня, чтобы сделать это. – mentics

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

+0

Спасибо, но это не интересно для того, что я пытаюсь сделать. Вы должны указать параметр второго типа. – mentics

Смежные вопросы