Я знаю, что на несколько лет опаздываю на эту вечеринку, но я столкнулся с этим вопросом, пытаясь решить ту же проблему. Вы можете использовать внутренний поиск Eclipse программно, если вы пишете плагин Eclipse (и, таким образом, используете их кеширование и т. Д.), Чтобы найти классы, которые реализуют интерфейс. Вот мой (очень грубый) первый снимок:
protected void listImplementingClasses( String iface ) throws CoreException
{
final IJavaProject project = <get your project here>;
try
{
final IType ifaceType = project.findType( iface );
final SearchPattern ifacePattern = SearchPattern.createPattern( ifaceType, IJavaSearchConstants.IMPLEMENTORS );
final IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
final SearchEngine searchEngine = new SearchEngine();
final LinkedList<SearchMatch> results = new LinkedList<SearchMatch>();
searchEngine.search( ifacePattern,
new SearchParticipant[]{ SearchEngine.getDefaultSearchParticipant() }, scope, new SearchRequestor() {
@Override
public void acceptSearchMatch( SearchMatch match ) throws CoreException
{
results.add( match );
}
}, new IProgressMonitor() {
@Override
public void beginTask( String name, int totalWork )
{
}
@Override
public void done()
{
System.out.println( results );
}
@Override
public void internalWorked( double work )
{
}
@Override
public boolean isCanceled()
{
return false;
}
@Override
public void setCanceled( boolean value )
{
}
@Override
public void setTaskName( String name )
{
}
@Override
public void subTask( String name )
{
}
@Override
public void worked( int work )
{
}
});
} catch( JavaModelException e )
{
e.printStackTrace();
}
}
Первой проблемой, которую я вижу до сих пор, является то, что я только улавливаю классы, которые непосредственно реализуют интерфейс, а не все их подклассы - но небольшая рекурсия никогда больно кому угодно.
Формулировка C ++ 17 для знаковых сдвигов влево (E1 << E2
) была:
В противном случае, если E1 имеет тип со знаком и неотрицательное значение, и E1 × 2 E2 sup> представляется в соответствующем типе без знака типа результата, тогда это значение, преобразованное в тип результата, является результирующим значением; в противном случае поведение не определено.
blockquote>Формулировка C ++ 20 для целых чисел как со знаком, так и без знака:
Значение E1 < < E2 - это уникальное значение, равное E1 × 2 E2 sup> по модулю 2 N sup>, где N - показатель диапазона типа результата.
blockquote>По сути, это одно и то же; разница в том, что теперь он работает, если E1 отрицателен. «Показатель диапазона» - это, в основном, число битов в типе (показатель диапазона для 16-разрядного целого числа со знаком равен 16).
Сдвиг влево не сдвинулся в бит знака, и все еще не сдвинулся.